1. 程式人生 > >MVC4 成員資格、 身份驗證

MVC4 成員資格、 身份驗證

SimpleMembership,成員資格提供程式、 通用的提供者和新的 ASP.NET 4.5 Web 窗體和 ASP.NET MVC 4 模板

ASP.NET MVC 4 網際網路模板中新增一些新的、 非常有用的功能,構建 SimpleMembership。這些更改將新增一些很有特色,像很多更簡單、 可擴充套件會員 API 和 OAuth 的支援。但是,新的帳戶管理功能需要 SimpleMembership 和對現有 ASP.NET 成員資格提供程式不起作用。我將開始與頂尖的東西你需要知道,摘要,然後挖到更多細節。

摘要:

  • SimpleMembership 的設計作為替換為先前的 ASP.NET 角色和成員資格提供程式系統
  • SimpleMembership 解決了開發人員遇到與成員資格提供程式系統,為現代的使用者設計的常見問題 / 會員 / 儲存需求
  • SimpleMembership 集成了以前的會員制度,但不是能使用 MembershipProvider 與 SimpleMembership
  • 新的 ASP.NET MVC 4 網際網路應用程式模板 AccountController 需要 SimpleMembership 並不是與以前的 MembershipProviders 相容
  • 您可以繼續使用現有的 ASP.NET 角色和成員資格提供程式在 ASP.NET 4.5 和 ASP.NET MVC 4-只是不與 ASP.NET MVC 4 AccountController
  • 現有 ASP.NET 角色和成員資格提供程式系統仍然是支援的因為它是 ASP.NET 核心的一部分
  • 4.5 ASP.NET Web 窗體不會使用 SimpleMembership ;它實現了在 ASP.NET 成員資格的 OAuth
  • ASP.NET 網站管理工具 (WSAT) 不是與 SimpleMembership 相容

以下是與埃裡克 · 波特 (下午為 ASP.NET MVC) 的幾次談話的結果,以確保我有過一些整體的詳細資訊直,結合了很多時間在瀏覽工具的 ILSpy 和 Visual Studio 元件周圍挖土。

SimpleMembership: 未來的 ASP.NET 成員資格

ASP.NET 成員資格系統

介紹了以 ASP.NET 2.0 在 2005 年。它為了解決常見的網站成員要求在時,一般涉及的使用者名稱 / 密碼根據註冊和配置檔案儲存在 SQL Server 中的。它被設計幾個擴充套件性機制-尤其是一個提供程式系統 (這允許您重寫一些細節像備份儲存) 和儲存附加的配置檔案資訊 (雖然附加的配置檔案資訊被打包到單個列,通常需要通過 API 訪問) 的能力。雖然有時令人沮喪,與工作,但它舉行了七年-可能因為它處理的主要用例 (使用者名稱 / 密碼基於 SQL Server 資料庫中的成員身份) 順利和可以適應大多數其他需要 (再次,往往令人沮喪,但它可以工作)。

ASP.NET Web 頁面和 WebMatrix 努力使團隊有機會看看很多東西-新如 Razor 語法入門 ASP.NET 網頁中,不 ASP.NET MVC。ASP.NET 網頁中團隊設計的 SimpleMembership (等待它) 簡化處理成員資格的任務。:

與 ASP.NET 網頁和 WebMatrix 的介紹我們的團隊擁有的堆疊真的重點使事情更簡單,開發人員。基於大量的客戶反饋,我們想要改善的領域之一是內建在 ASP.NET 中的安全。所以此版本我們花了時間來建立一個新的內建的 (和 ASP.NET 網頁的預設值) 安全提供程式。我說提供商,因為新的東西仍然建立在現有的 ASP.NET 框架。所以我們叫它什麼我們已建立了此新痾?很好,沒有別的SimpleMembershipSimpleMembership是一個總稱為SimpleMembershipSimpleRoles.

簡化會員資格的一部分涉及修復一些常見的 ASP.NET 成員資格問題。

ASP.NET 成員資格的問題

ASP.NET 成員資格很明顯是圍繞一組假設的設計:

  • 使用者和使用者資訊將最有可能儲存在一個完整的 SQL Server 資料庫中或在 Active Directory 中
  • 將圍繞一系列共同屬性的優化使用者和配置檔案資訊 (使用者名稱、 密碼、 IsApproved、 CreationDate、 評論角色成員資格...) 和其他使用者配置檔案資訊將通過配置檔案提供程式訪問

從這些假設掉下來的幾個問題。

要求完整的 SQL Server 在預設情況下

預設情況下和全功能提供商大多數 ASP.NET 成員資格提供商 (SQL 成員資格提供程式,SQL 角色提供程式,SQL 配置檔案提供程式),需要完整的 SQL 伺服器。他們依賴於儲存的過程的支援,和它們依賴於 SQL Server 快取依賴項,他們清潔取決於代理和維修。所以基於 SQL Server 提供的主要好在 SQL Server CE 上不工作,不會工作框中 SQL Azure,等等。

注:柯福勒最近讓我知道這些,做支援成員資格、 個性化設定、 配置檔案、 和角色。但我們需要一套單獨的 SQL 指令碼的支援頁面的事實突出了根本問題。

啊哈,你說 !Jon 的忘了通用的提供者,又叫 System.Web.Providers !堅持一下,我們會給那些......

自定義成員資格提供程式必須使用一個 SQL 伺服器為中心的 API

如果你想要與另一個數據庫或其他成員資格儲存系統協同工作,您需要向從提供程式的基類繼承和重寫方法,集中儲存在關係資料庫中的 MembershipUser 的一群。它可以做 (和您經常可以發現已經寫的很好的),但它是大量的工作,往往將給你留下醜陋的程式碼,已請有趣的一群,因為有很多隻是不適用的方法。

圍繞使用者、 角色和配置檔案的特定檢視設計

現有的提供商的重點是傳統會員-使用者既有一個使用者名稱和密碼),一些特定的角色,例如管理員高階使用者),在網站上,可能有一些其他的"好了"可選資訊,可以通過在您的應用程式中的 API 訪問。

這並不很符合一些現代用法模式:

  • 在 OAuth 和 OpenID,使用者沒有密碼
  • 通常這些型別的情況下對映到使用者索賠或權利而不是整體使用者角色更好
  • 許多站點配置檔案或其他非傳統的資訊是非常重要和需要從什麼地方來的 API 呼叫對映到資料庫 blob

什麼在這裡會更好地工作很多是您得以定義您的使用者、 許可權和系統屬性,但是你想要和成員資格系統工作與您的模型-不是。

需要特定的架構,blob 列中的溢位

我已經提到過這幾次,但是它承擔分別呼叫-ASP.NET 成員資格的重點是 SQL Server 儲存和儲存基於非常特定的資料庫架構。

aspnet_tutorial04_MembershipSetup_vb_figure10[1]

更新: 此架構已經進步了很多與普遍的提供商。刪除檢視和儲存的過程和表的簡化。

2012-09-05_16h12_30

不過,主要的問題是不變: 你不在的架構中,控制和任何配置檔案資料儲存在配置檔案表中的屬性值 blob 中:

2012-09-05_16h14_31

作為一個更好的成員資格系統 SimpleMembership

你可能已經猜到了,SimpleMembership 被為了解決上述問題。

您的架構與工程

馬修 Osborn 解釋說在他的 SimpleMembership 使用與 ASP.NET 網頁的文章,SimpleMembership 旨在將與您的資料庫架構整合:

所有SimpleMembership都需要的只是有兩個列在您的使用者表上以便我們可以掛接到它 — —"ID"列和"使用者名稱"列。這裡重要的是他們可以命名任何你想要。例如使用者名稱不一定要它可能是你只需要告訴SimpleMembership將其看作"使用者名稱",用來登入電子郵件列的別名。

馬修的示例演示使用同一個使用者 Id 和使用者名稱的列,然後一群他想要在其應用程式中其他列的命名的使用者 (它可能被命名為任何東西) 非常簡單的使用者表。

UsersTable[1]

然後我們點 SimpleMemberhip 在表中具有一行程式:

?
1 WebSecurity.InitializeDatabaseFile("SecurityDemo.sdf", , "Users" "UserID", "Username", true);

需要沒有其它的表,該表可以命名任何我們想要,可以有很多我們想要的只要我們有東西我們可以對映到一個使用者名稱和 ID 的任何架構。

擴大到整個 SQL Server 家族資料庫支援

雖然 SimpleMembership不是資料庫不可知,它整個 SQL Server 系列工作。它繼續支援完整的 SQL Server,但它也可以配合 SQL Azure、 SQL Server CE、 SQL Server Express,和 LocalDB.一切都作為 SQL 呼叫來實現而不需要儲存的過程、 檢視、 代理和更改通知。

請注意 SimpleMembership 仍然需要一些風味的 SQL Server-它不會工作與 MySQL,NoSQL 資料庫等。你可以看看 WebMatrix.WebData.dll 使用的工具,如 ILSpy,如果你想要看看為什麼-有很中的程式碼在 SQL 伺服器特定的 SQL 語句正在執行,尤其是建立和初始化表時的地方。好像你可能能夠工作與另一個數據庫,如果建立表分開,但我沒試過,此時不支援它。

注: 我想它將有可能為 SimpleMembership (或相容的東西) 要執行實體框架,所以它會與 EF 支援的任何資料庫。這似乎對我的想法很有用嗎?

注: SimpleMembership 有同樣的資料庫支援-SQL Server 家族中的任何東西-普遍提供商帶給 ASP.NET 成員資格系統。

更新更新更新的普遍提供商-我相信從 1.2 發行版 8/16 開始-是現在真的資料庫不可知論者,所以他們會工作有實體框架提供程式的任何資料庫。

輕鬆地與實體框架程式碼優先

與 ASP.NET 成員資格系統中用於儲存其他帳戶資訊的問題是它是門守護者。這就意味著你被困其架構和通過它的 API 訪問的配置檔案資訊。

SimpleMembership 翻轉周圍一圈通過允許您使用任何表作為一個使用者儲存區。這意味著你在控制中的使用者配置檔案資訊,並且您可以訪問它,但是你會喜歡-它是隻是資料。讓我們看看一種實用的基於 ASP.NET MVC 4 網際網路專案中的 AccountModel.cs 類。在這裡我生日屬性新增到使用者配置檔案的類。

?
1 2 3 4 5 6 7 8 9 [Table("UserProfile")] publicclassUserProfile { [Key] [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] publicintUserId { get; set; } publicstringUserName { get; set; } publicDateTime Birthday { get; set; } }

現在我想要訪問的資訊,如果我可以只是抓住該帳戶的使用者名稱和讀取的值。

?
1 2 3 4 var context = newUsersContext(); var username = User.Identity.Name; var user = context.UserProfiles.SingleOrDefault(u => u.UserName == username); var birthday = user.Birthday;

所以不想 SimpleMembership 作為一個大會員 API,認為它作為處理基於您的使用者資料庫的成員身份的東西。在 SimpleMembership,一切都被鍵控關閉使用者表的行中定義而不是一群沒有您的控制元件的成員表中的項。

SimpleMembership 是如何整合與 ASP.NET 成員資格

好吧,足夠銷售瀝青 (和希望背景) 上為什麼事情發生了變化。這將如何影響你?讓我們開始與要顯示的關係圖 (注: 我已經通過刪除幾個類來顯示重要關係簡化):

2012-08-29_16h59_20

所以 SimpleMembershipProvider 是 ExtendedMembershipProvider,其中 MembershipProvider 從繼承,並新增一些其他帳戶的執行情況和 OAuth 相關的事情。這裡是 ExtendedMembershipProvider 將新增到 MembershipProvider:

ExtendedMembershipProvider

重要在這裡帶走的是 SimpleMembershipProvider 是 MembershipProvider,但 MembershipProvider 不是 SimpleMembershipProvider。

這種區分是重要的實踐:需要 SimpleMembershipProvider,WebMatrix.WebData.WebSecurity 或 Microsoft.Web.WebPages.OAuth.OAuthWebSecurity 中包括任何呼叫的 API 不能使用 (包括在 System.Web.Providers 中找到的普遍提供商) 現有 MembershipProvider.

可是,只要它去。成員資格提供程式仍然工作如果您通過標準的成員資格 API,和所有核心的東西 — — 包括 AuthorizeAttribute,作用執法等-訪問他們將工作只是罰款並沒有任何改變。

讓我們看看如何影響你的新模板。

在 ASP.NET MVC 4 專案模板中的成員資格

ASP.NET MVC 4 提供了六個專案模板:

  • -真的很空,只是程式集、 資料夾結構和一點點的基本配置。
  • 基本-像空,但有一點點的預配置的使用者介面 (css / 影象 / 捆綁銷售)。
  • 網際網路-這有一家和帳戶的控制器和關聯的檢視。帳戶控制器支援註冊和登入通過任一本地帳戶和 OAuth / OpenID 提供商。
  • 內聯網-像網際網路的模板,但它被配置為 Windows 身份驗證。
  • 移動-這預先配置為使用 jQuery 移動,它旨在為僅移動網站。
  • Web API -這預配置為基於 ASP.NET 的 Web API 服務後端。

2012-08-29_17h26_24

從這些模板中,只有一個 (網際網路模板) 使用 SimpleMembership。

ASP.NET MVC 4 基本模板

基本模板已配置的與普遍提供商使用 ASP.NET 成員資格。您可以看到該 ASP.NET MVC 4 基本模板 web.config 中的配置:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 <profiledefaultProvider= ="DefaultProfileProvider"> <providers> <addname= ="DefaultProfileProvider"type= ="System.Web.Providers.DefaultProfileProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"connectionStringName= ="DefaultConnection"applicationName="/" /> </providers> </profile> <membershipdefaultProvider= ="DefaultMembershipProvider"> <providers> <addname= ="DefaultMembershipProvider"type= ="System.Web.Providers.DefaultMembershipProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"connectionStringName= ="DefaultConnection"enablePasswordRetrieval= ="false"enablePasswordReset= ="true"requiresQuestionAndAnswer= ="false"requiresUniqueEmail= ="false"maxInvalidPasswordAttempts= ="5"minRequiredPasswordLength= ="6"minRequiredNonalphanumericCharacters= ="0"passwordAttemptWindow= ="10"applicationName="/" /> </providers> </membership> <roleManagerdefaultProvider= ="DefaultRoleProvider"> <providers> <addname= ="DefaultRoleProvider"type= ="System.Web.Providers.DefaultRoleProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"connectionStringName= ="DefaultConnection"applicationName="/" /> </providers> </roleManager> <sessionStatemode= ="InProc"customProvider= ="DefaultSessionProvider"> <providers> <addname= ="DefaultSessionProvider"type= ="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"connectionStringName= ="DefaultConnection" /> </providers> </sessionState>

這意味著它是業務像往常一樣的基本模板所知 ASP.NET 成員資格的工作。

ASP.NET MVC 4 網際網路模板

網際網路模板都有幾件事將設定為引導 SimpleMembership:

2012-08-29_17h45_32

  • \Models\AccountModels.cs定義了一個基本的使用者帳戶,包括資料批註要定義的鍵和這種
  • \Filters\InitializeSimpleMembershipAttribute.cs建立成員資格資料庫使用,上面的模型,然後呼叫 WebSecurity.InitializeDatabaseConnection,驗證基礎表在放置和標記為已完成初始化 (用於應用程式的生存期)
  • \Controllers\AccountController.cs使大量使用的 OAuthWebSecurity (OAuth 帳戶註冊 / 登入 / 管理) 和 WebSecurity。WebSecurity提供的帳戶管理服務,用於 ASP.NET MVC (和 Web 頁)

WebSecurity 可以使用任何 ExtendedMembershipProvider 工作。那裡是一個在框中 (SimpleMembershipProvider),但您可以編寫您自己。因為標準的 MembershipProvider 不是 ExtendedMembershipProvider,WebSecurity 將引發異常,如果預設成員資格提供程式是 MembershipProvider,而不是 ExtendedMembershipProvider。

實際的例子:

  1. 建立新的 ASP.NET MVC 4 應用程式使用網際網路應用程式模板
  2. 執行該應用程式、 登記冊上單擊,新增一個使用者名稱和密碼,並單擊提交

你會在 AccountController.cs::Register 以下 execption:要呼叫此方法,"Membership.Provider"屬性必須是例項的"ExtendedMembershipProvider"。

2012-08-29_18h34_13

出現這種情況是因為 ASP.NET 通用提供商包包括一個 web.config 變換,將會更新您新增我上面的基本模板示例中顯示的通用提供程式配置的 web.config。當 WebSecurity 嘗試使用配置的 ASP.NET 成員資格提供程式時,它會檢查是否它可以轉換為 ExtendedMembershipProvider 才能做其他事。

所以,你該怎麼辦?

選項:

如果您想要使用新的 AccountController,您要麼需要使用 SimpleMembershipProvider 或另一個有效的 ExtendedMembershipProvider。這是很簡單的。

如果你想要在 ASP.NET MVC 4 中使用現有的 ASP.NET 成員資格提供程式,您不能使用新的 AccountController。你可以做幾件事:

  1. 替換的 AccountController.cs 和 AccountModels.cs 在一個 ASP.NET MVC 4 網際網路專案從 ASP.NET MVC 3 應用程式 (你當然不會有 OAuth 的支援)。然後,如果你想,你可以去並刪除其他的事情,圍繞 SimpleMembership-OAuth 分部檢視,NuGet 包 (例如 DotNetOpenAuthAuth 包等)
  2. 使用 ASP.NET MVC 4網際網路應用程式模板並新增一個普遍提供商 NuGet 包中。然後複製中的 AccountController 和 AccountModel 類。

這些都不是特別優雅或簡單。也許我們 (或者只是我?) 可以做些為了使這更簡單-也許 NuGet 包。然而,這應該是一個邊緣案例-希望你會需要建立新的 ASP.NET,但使用舊式 ASP.NET 成員資格提供程式的案件應該很少見。請讓我 (或,最好是團隊) 知道是否這是不正確的假設。

ASP.NET 4.5 專案模板中的成員身份

4.5 ASP.NET Web 窗體採取了不同的方法,生成了 ASP.NET 成員資格。而不是使用 WebMatrix 安全程式集,Web 窗體使用 Microsoft.AspNet.Membership.OpenAuth 程式集。我不是專家在這方面,但從 ILSpy 和 Visual Studio (非常漂亮) 依賴關係圖中的時間點,這使用成員資格的介面卡儲存 OAuth 入 EF 資料託管資料庫仍在執行在 ASP.NET 成員資格的同時。

2012-08-29_19h13_13

注: 可能有辦法使用這在 ASP.NET MVC 4 中,雖然它可能會把它掛一些水暖工作。

這不會如何適應普遍提供商 (System.Web.Providers) 的?

只是想總結一下:

  • 普遍提供商的目的的情況下你有現有的 ASP.NET 成員資格提供程式,並且您想要使用另一個 SQL Server 資料庫後端 (非 SQL Server)。它不需要代理商處理過期的會話清理和其他後臺任務,它依附在其他呼叫這些任務。
  • 普遍提供商不是思維的真的,嚴格地說,普遍-至少我方式。他們只工作與 SQL Server 家族中的資料庫。
  • 普遍提供商不能用簡單的成員資格。
  • 普遍提供商包包括一些 web 配置轉換,您通常希望當你使用它們。

網站管理工具呢?

Visual Studio 包含模具啟動網站管理工具(WSAT) 在您的應用程式中配置使用者和角色。

image102[1]

WSAT 工作與 ASP.NET 成員資格,而生成並不是相容的簡單的成員。有兩個主要選項有:

  1. 使用 WebSecurity 和 OAuthWebSecurity API 來管理使用者和角色
  2. 建立使用上述的 Api 是 web 管理員
  3. 因為在您的資料庫上執行 SimpleMembership,您可以更新您的使用者將任何其他資料-通過 EF 或甚至在 (中的課程的發展) 的直接資料庫編輯