Asp.net

.NET 4.0 中的自定義 MembershipProvider

  • April 18, 2011

關於這個問題,這裡有一些執行緒,但其中大多數已經過時,其中的參考連結更加過時。

我得到了這個網站,我需要使用它自己的表結構連接到外部 sql 伺服器 (mssql),使用預設的 asp.net 成員提供程序結構不是一個選項。表格佈局非常簡單,使用者表格看起來像這樣(它被稱為個人)

Individuals
- UserGuid (uniqueidentifier/guid, unique)
- Name (varchar)
- Password (varchar)
- HasAccess (tinyint/ 1 or 0)
- DateTime (datetime)
- Log (xml)

所需的功能只是讓某人登錄,其餘的不是必需的:)

我遵循了一些指南,但其中大多數都已過時且非常複雜。不幸的是,msdn 範例遵循這種模式,並且文件不是很好。

因此,如果有人獲得一些資源來展示如何,或者願意在此處發布程式碼範例或類似內容,我將不勝感激。

謝謝!

這真的很簡單:

  1. 創建一個新的 Class 文件(如果你不使用多層系統,在項目的 Models 文件夾中)讓我們呼叫MyMembershipProvider.cs
  2. 繼承該類System.Web.Security.MembershipProvider
  3. 自動創建需要的方法(繼承類中的句點+空格)

完畢!

所有方法都會有NotImplementedException例外,您需要做的就是編輯每個方法並輸入您自己的程式碼。例如,我定義GetUser如下所示:

public override MembershipUser GetUser(string username, bool userIsOnline)
{
   return db.GetUser(username);
}

db是我添加到類中的數據庫儲存庫

MyServicesRepository db = new MyServicesRepository();

在那裡,您會發現該GetUser方法為:

public MembershipUser GetUser(string username)
{
   OS_Users user = this.FindUserByUsername(username);

   if (user == null)
       return
       new MembershipUser(
           providerName: "MyMembershipProvider",
           name: "",
           providerUserKey: null,
           email: "",
           passwordQuestion: "",
           comment: "",
           isApproved: false,
           isLockedOut: true,
           creationDate: DateTime.UtcNow,
           lastLoginDate: DateTime.UtcNow,
           lastActivityDate: DateTime.UtcNow,
           lastPasswordChangedDate: DateTime.UtcNow,
           lastLockoutDate: DateTime.UtcNow);

   return
       new MembershipUser(
           providerName: "MyMembershipProvider",
           name: user.username,
           providerUserKey: null,
           email: user.email,
           passwordQuestion: "",
           comment: "ANYTHING you would like to pass",
           isApproved: true,
           isLockedOut: user.lockout,
           creationDate: user.create_date,
           lastLoginDate: user.lastLoginDate,
           lastActivityDate: user.lastActivityDate,
           lastPasswordChangedDate: user.lastPasswordChangedDate,
           lastLockoutDate: user.lastLockoutDate);
}

對您使用的所有方法執行此操作(調試項目並查看您需要哪些方法) - 我只使用一些,而不是全部,因為我並不真正關心諸如ChangePasswordQuestionAndAnswer,DeleteUser等方法

只需確保在您中web.config添加新的會員資格:

<membership defaultProvider="MyMembershipProvider">
 <providers>
   <clear/>
   <add name="MyMembershipProvider" type="Your.NameSpace.MyMembershipProvider" connectionStringName="OnlineServicesEntities"
        enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
        maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
        applicationName="/" />
 </providers>
</membership>

您有一個來自 Chris Pels 的精彩影片教程(日期為 2007 年,但仍然大部分有效)和此程式碼,雖然影片教程是在 VB 中,但讓我們了解這些步驟……

<http://www.asp.net/general/videos/how-do-i-create-a-custom-membership-provider>

我不僅創建了自己的 Membership Provider,而且還創建了 Roles Provider,正如您從上面的程式碼中看到的那樣,它與 MemberShip 一樣簡單,讓您在您的應用程序中使用以下內容:

[Authorize(Roles = "Partner, Admin")]
public ActionResult MyAction()
{

}

@if (Roles.IsUserInRole(Context.User.Identity.Name, "Admin"))
{
   &lt;div&gt;You're an ADMIN, Congrats!&lt;/div&gt;
}

什麼是自動創建所需的方法(繼承類中的句點+空格)

您可以右鍵點擊,或將游標放在名稱上,然後按Control+ .,然後按space

引用自:https://stackoverflow.com/questions/5701673