如何將我自己的數據庫與 SimpleMembership 和 WebSecurity 一起使用?什麼是 MVC4 安…
我已經閱讀了我能找到的關於這個主題的所有內容,包括 MSDN 文章和 SO 文章,但我仍然非常迷茫和困惑。
問題
請回答以下問題(如果可能,請簡要回答):
- 什麼是SimpleMembership/SimpleMembershipProvider ( WebMatrix.WebData ),它/他們負責什麼?
- 什麼是WebSecurity ( WebMatrix.WebData )?
- 什麼是Membership ( System.Web.Security ) 類?
- 為什麼 MVC4 會創建一個UserProfile表和一個pages_Membership表?它們有什麼用,有什麼區別?MVC4 創建的 UserProfile 類是什麼?
- 什麼是UsersContext類?
- 所有這些如何協同工作以進行使用者身份驗證?
我的情況
然後這些問題導致下一個問題:
假設我有一個包含使用者(ID、使用者名、密碼)的現有數據庫。我正在創建一個新的 MVC4 應用程序並使用表單身份驗證。使用者密碼以加密形式(不是 bcrypt)儲存在數據庫中。
我必須做些什麼才能使它與 MVC4 一起工作?
我是否必須創建自定義MembershipProvider?
到目前為止我的知識
據我了解,WebSecurity是一個與MembershipProvider互動的靜態類(模組) 。MembershipProvider 是一個解釋特定功能如何工作的類,例如ValidateUser、CreateUser、ChangePassword。
為了解決我的問題,我假設我需要創建一個自定義 MembershipProvider 並告訴 WebSecurity 使用我的新 MembershipProvider。
賞金?
我已經懸賞了這個問題,並打算將其獎勵給 Andy Brown,以表彰其出色的答案。
請參閱每個報價下方的摘要以獲取快速答案,並查看段落以獲取詳細資訊。另請參閱最後的參考資料部分以獲取權威來源。
總結
1.什麼是SimpleMembership/SimpleMembershipProvider (WebMatrix.WebData),它/他們負責什麼?
SimpleMembership(一個涵蓋
SimpleMembershipProvider和的術語SimpleRoleProvider)負責提供一種簡潔快捷的方式來實現一個 80% 即插即用的身份驗證和授權框架,該框架具有安全的密碼儲存,任何人都可以使用。2.什麼是WebSecurity(WebMatrix.WebData)?
WebSecurity是與Membership和一起工作的常見成員任務的助手類OAuthWebSecurity。角色仍然可以通過Roles.3.什麼是Membership(System.Web.Security)類?
Membership是管理使用者設置和操作的原始 ASP.NET 成員實現的靜態類。許多使用者操作仍然在這裡完成,而不是在WebSecurity. 他們都使用您選擇的同一提供商。4.MVC4為什麼要創建UserProfile表和webpages_Membership表?它們有什麼用,有什麼區別?MVC4 創建的 UserProfile 類是什麼?
這兩個表執行不同的功能。架構由
webpages_Membership框架控制並用於憑據,UserProfile架構由我們控制並用於我們要針對使用者儲存的任何屬性。5.什麼是UsersContext類?
它是一個
DbContext(DbContext API的一部分),作為 MVC Internet 應用程序模板的啟動提供。它唯一的工作是包含UserProfile類,以便我們可以使用它(例如通過InitializeSimpleMembershipAttribute)。6.所有這些如何協同工作來進行使用者身份驗證?
現在從上面的總結和下面的細節中應該可以看出這一點。用途:
WebSecurity用於常見任務;UserProfile用於儲存針對使用者的自定義屬性,通過UsersContext(在 Visual Studio“MVC Internet 應用程序”模板中)訪問;Membership何時WebSecurity或OAuthWebSecurity沒有該方法;和Roles角色。使用 VS 模板的控制器查看使用範例。編輯. 萬一有人走到這一步
假設我有一個現有的數據庫……
如果您有一個現有的數據庫,並且您編寫自定義會員提供程序的唯一原因是處理您的舊密碼儲存方法,那麼您可以使用一種解決方法。這只有在您可以從舊密碼儲存轉移到 SimpleMembership 算法(使用
Rfc2898DeriveBytes該類)時才有效。詳情見腳註。如果您不能離開,那麼是的,您將不得不創建自己的提供程序來使用您的特定密碼算法,您可以通過從
SimpleMembershipProvider.注意:
SimpleMembershipProvider將散列您的密碼而不是對其進行加密。如果您不知道區別以及為什麼這很重要,那麼在為您自己的提供商提供自定義安全之前請三思而後行細節
1.什麼是SimpleMembership/SimpleMembershipProvider
要了解這一切如何結合在一起,有助於了解歷史。
- ASP.NET 於 2005 年引入了 ASP.NET Membership 系統
- 該系統使用提供者從用於管理帳戶和角色等的通用介面中抽像出實現細節。
- 它還為我們提供了基本的“使用者配置文件”功能(儲存在單列 xml 欄位中,因此人們傾向於避免使用)
- SimpleMembership 於 2010 年發布,作為一個插入 ASP.NET 會員系統的提供程序,但也允許 OAuth 身份驗證和按列屬性儲存使用者配置文件(而不是原始中使用的單列儲存)執行)。
SimpleMembershipProvider實現ExtendedMembershipProvider擴展原始提供程序實現它是codeplex上的開原始碼(鏡像在 github 上)。因此,就安全性而言,您可以自己評估程式碼、複製程式碼、更改程式碼等。您應該對開源安全性的優缺點有自己的看法,並通過一些NIH來解決這個問題。(個人觀點:有時用,其他時候不用)
ExtendedMembershipProvider本身添加了類似於GeneratePasswordResetToken舊會員提供程序 api 的命令。2.什麼是WebSecurity(WebMatrix.WebData)?
WebSecurity只是一個外觀或幫助類,用於提供SimpleMembershipProvider對一個地方的簡單訪問並使常見任務易於訪問。它既可以提供幫助,也因為原始框架的擴展ExtendedMembershipProvider意味著一些原始類Membership現在還不夠。例子:
WebSecurity.CurrentUserName- 獲取目前登錄使用者的名字WebSecurity.CreateUserAndAccount. 同時創建使用者並設置使用者配置文件屬性(例如WebSecurity.CreateUserAndAccount(userName, pw, new { Email = model.Email });WebSecurity.InitializeDatabaseConnection- 快速設置一個新的/現有的數據庫以供會員使用,選擇您的使用者 ID 列和使用者自然鍵標識符等。ResetPassword重置使用者密碼GeneratePasswordResetToken等等這些方法通常取決於您正在使用的提供者,它們不僅僅依賴於 SimpleMembership,而且它們將像您的提供者這樣的對象聯繫在一起,並
Membership提供一個共同點來執行成員資格功能。請注意,
OAuthWebSecurity這也相當於WebSecurityOAuth 身份驗證。3.什麼是Membership(System.Web.Security)類?
Membership來自原始實現;它使用現在擴展的基本MembershipProvider實現來管理使用者設置並執行與使用者相關的操作。ExtendedMembershipProvider它是一個靜態類,因此在您聲明命名空間的任何地方都可用,因此是一種簡單的方法,例如,檢索目前使用者:Membership.GetUser
WebSecurity做一些事情而不做其他事情,做一些事情而不做其他事情會造成混亂Membership。如果您將WebSecurity其視為用於更高級別操作的工具包,並且Membership將其視為對使用者做事的工具包,那麼您會沒事的;他們一起為您的提供商工作。4.MVC4為什麼要創建UserProfile表和webpages_Membership表?它們有什麼用,有什麼區別?MVC4 創建的 UserProfile 類是什麼?
webpages_Membership是一個具有固定模式的表,我們不理會它,它允許提供者進行基本的帳戶操作,主要是儲存憑據。UserProfile是我們定制的用於儲存針對使用者帳戶的資訊的表,並通過UserProfile該類以強類型格式提供。- 有一個名為的額外表
webpages_OAuthMembership與 執行相同的工作webpages_Membership,但用於您想要集成的 OAuth 登錄提供程序。這種設置的神奇之處在於,單個使用者可以在您自己的網站上進行會員登錄,並且可以通過不同的提供商(如 google、facebook)進行任意數量的 OAuth 登錄,並且它們都共享一個儲存在
UserProfile通常,如果一個表以 開頭
webpages_,則意味著有一個 API 可以訪問它。該UserProfile表由UserProfile您的類表示UsersContext(如果您使用預設的 MVC Internet 應用程序模板)。因此,我們通過對包含在 a 中的任何類使用的常用方法來訪問它DbContext。
UserProfile程式碼優先友好:您可以添加列(如使用者UserProfile不必這樣呼叫該表 - 您可以使用WebSecurity.InitializeDatabaseConnection呼叫[Table("UserProfile")] public class UserProfile、 和您自己的遷移來更改它。5.什麼是UsersContext類?
這來自 Visual Studio 新項目中提供的 MVC Internet 應用程序模板。我要做的第一件事是確保它與我自己的數據庫上下文共享一個公共連接字元串(假設成員表在同一個數據庫中)。如果需要,您可以更改它並在以後將它們解耦。
您不需要將其與您自己的上下文分開-僅當您現在或將來想將成員資訊儲存在不同的數據庫中時才需要這樣做 如果您擺脫它,您只需將引用更改
UsersContext為您自己的上下文, 調整Database.SetInitializer.參考:
Using SimpleMembership With ASP.NET WebPages - Matthew Osborn
- 這是關於 SimpleMembership 的原始參考資料,以及它是什麼、為什麼是以及它的作用:
MSDN - Introduction to Membership
- Membership 仍然是 SimpleMembership 的核心,因此對它有所了解會有所幫助。
- codeplex 原始碼(鏡像在 github 上)。
WebSecurityOAuthWebSecuritySimpleMembershipProviderExtendedMembershipProviderSimpleRoleProviderMembershipRolesDbContext和DbContext API編輯腳註:進行滾動密碼升級的詳細資訊
添加一個屬性來
UserProfile儲存帳戶所使用的密碼版本(例如,1 代表舊版,2 代表 SimpleMembership)在“登錄”操作中,編寫程式碼以便:
如果他們在您的 SimpleMembership 密碼版本上,您可以正常登錄
如果他們在舊密碼版本上,您:
- 使用您的舊方法進行檢查
- 如果正確,您使用
ResetPasswordthen重置它ChangePassword以使用 SimpleMembership 版本,這會將欄位更新為新密碼版本- 最後更新密碼版本
UserProfile以類似方式更新任何其他使用密碼的 AccountsController 方法。
使用 hacky 解決方法並耦合到
webpages_Membership我們不打算觸摸的表,因為您不必編寫新的自定義提供程序。可以使用
TransactionScope. 唯一令人討厭的事情是控制器中的額外程式碼,以及與webpages_Membership.