2011-04-18 41 views
40

這裏有一些關於此問題的線程,但其中大多數已過時,而且其中的引用鏈接更爲過時。.NET 4.0中的自定義MembershipProvider

我得到這個網站,我需要連接到外部的SQL服務器(mssql)與它自己的表結構,使用默認的asp.net成員資格提供程序結構不是一個選項。該表的佈局是非常簡單和用戶表看起來像這樣(這就是所謂的個人)

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

所需要的功能僅僅是登錄有人在,剩下的就是沒有必要的:)

我跟着一些導遊,但其中大部分已經過時並且非常複雜。不幸的是,MSDN的例子遵循這種模式,文檔不是很好。

因此,如果任何人有一些資源顯示如何,或者願意在這裏發佈codesamples或類似的,我會很感激。

謝謝!

+0

我已經搜索了很多次簡單的提供商。總是發現一些過於複雜的東西。所以我決定創建自己的5個班級。見http://github.com/TesserisPro/ASP.NET-SImple-Security-Provider – Dmitry 2014-08-19 10:16:34

回答

62

這真的很簡單:

  1. 創建一個新的類文件(如果你不使用多層系統,在項目的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); 
} 

對所有使用的方法都進行此操作(調試項目並查看需要哪些方法) - 我只使用一些,而不是全部,因爲我並不關心m編制方法一樣ChangePasswordQuestionAndAnswerDeleteUser

只要確保你的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> 

你有一個很好的視頻教程從克里斯·佩爾斯(日期爲2007年,但仍然大部分是有效的),併爲此代碼,雖然視頻教程是在VB中,但讓我們來了解步驟...

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

我並不僅創造我自己的會員提供,但我創造了我的角色提供以及,巫婆你可以從上面的代碼中看到,是因爲成員身份簡單,讓你在你的應用程序使用了諸如:

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

} 

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

什麼是自動創建所需的方法(期+空間,在繼承類)

您可以用鼠標右鍵單擊,或對名稱上並按下控制 + 然後空間

+0

謝謝,我仍然需要安裝aspnet模式(由會員提供者使用的模式)和其他東西到我的遠程數據庫? – 2011-04-19 10:05:23

+0

否...該類沒有與數據庫模式的連接,則實現該模式。例如,我在我的示例中請求我自己的數據庫/我自己的表「OS_Users」給我用戶,只要你通過'MembershipUser'就可以了。 - >看到那個截屏視頻,我先在答案中發佈了視頻,所以你知道這是什麼。 – balexandre 2011-04-19 10:18:03

+0

謝謝,我終於想到了。謝謝你! :) – 2011-04-19 12:00:06

0

有幾個線程在這裏這麼 這件事情,但其中大部分都是 過時,在 參考鏈接他們是更加不合時宜。

自從在Framework 1.0中引入ASP.NET以來,Page.User/CurrentSession.User/IPrincipal/IIdentity模型沒有改變。在Framework 2.0中添加了成員​​資格提供程序。這些「過時的」參考仍然是有效的指導。 MSDN

相關問題