36

我想啓用ASP.NET MVC 4的SimpleMembership API來與我自己的數據庫模式集成。我在我的數據庫中的一個簡單明瞭的表格稱爲Users這些領域:SimpleMembership與ASP.NET MVC 4中的自定義數據庫模式

  • 標識
  • 名稱
  • 密碼
  • 電子郵件
  • 請將isDeleted

我已經配置了SimpleMembership API使用我的數據庫:

WebSecurity.InitializeDatabaseConnection("MyStuff", "Users", "Id", "Name", autoCreateTables: true); 

而且我可以插入過用戶:

WebSecurity.CreateUserAndAccount(model.UserName, model.Password, 
           new 
           { 
             IsDeleted = false, 
             Email = "[email protected]"     
           }); 

但是,密碼字段(或它的散列值)被沒有插入Users表(當然),它插入到另一個表webpages_Membership中,該表使用InitializeDatabaseConnection調用創建,幷包含大量不需要的不必要信息。

此外,我有其他自動創建的表,稱爲webpages_OAuthMembership,webpages_Roles和webpages_UsersInRoles,我不需要。

我已經試過表生成設置爲false:

WebSecurity.InitializeDatabaseConnection("MyStuff", "Users", "Id", "Name", autoCreateTables: false); 

但是,在這種情況下,CreateUserAndAccount調用將拋出一個異常,因爲它會找不到webpages_Membership表。

當我想使用SimpleMembership API時,它看起來像是需要這些表格。

我的問題是:當我只想要一個簡單的Users表時,我應該怎麼做?

我必須自己編寫整個成員資格處理和認證邏輯(散列碼生成等)嗎?

回答

11

我向產品團隊提出了同樣的問題。

SIMPLE成員資格的設計目標是儘可能簡單地開箱即用。

就表格而言,真的沒有可能的定製。 推薦的解決方法是仍然使用ASP.NET成員資格(SqlMembershipProvider)。

+0

好的,謝謝!也許我會寫我的自定義驗證邏輯。 – Zsolt

+33

不!請不要這樣做! :-) – Max

+0

使用SqlMembership非常簡單!只需搜索有關ASP.NET成員資格的教程。它非常靈活! – Max

3

1生成數據庫 看起來更清潔模式 - 你需要啓用遷移,prefereably用的EntityFramework 5.使用Enable-Migrations的NuGet包經理。

2 - 將您

WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "EmailAddress", autoCreateTables: true); 

在你YourMvcApp /遷移/ Configuration.cs類的種子法

protected override void Seed(UsersContext context) 
    { 
     WebSecurity.InitializeDatabaseConnection(
      "DefaultConnection", 
      "UserProfile", 
      "UserId", 
      "UserName", autoCreateTables: true); 

     if (!Roles.RoleExists("Administrator")) 
      Roles.CreateRole("Administrator"); 

     if (!WebSecurity.UserExists("lelong37")) 
      WebSecurity.CreateUserAndAccount(
       "lelong37", 
       "password", 
       new {Mobile = "+19725000000", IsSmsVerified = false}); 

     if (!Roles.GetRolesForUser("lelong37").Contains("Administrator")) 
      Roles.AddUsersToRoles(new[] {"lelong37"}, new[] {"Administrator"}); 
    } 

現在EF5將負責創建用戶配置表,這樣做後因此您將調用WebSecurity.InitializeDatabaseConnection以僅將SimpleMembershipProvider註冊到已創建的UserProfile表中,同時還將SimpleMembershipProvider列入UserId和UserName列。我還展示瞭如何添加用戶,角色並將您的Seed方法中的兩者與自定義UserProfile屬性/字段關聯的示例,例如用戶的手機(號碼)。

3 - 現在當你從包管理器控制檯運行更新的數據庫,EF5將提供與您的所有自定義屬性

有關其他參考資料,請參閱這篇文章源代碼的表: http://blog.longle.io/2012/09/25/seeding-users-and-roles-with-mvc4-simplemembershipprovider-simpleroleprovider-ef5-codefirst-and-custom-user-properties/

+2

我認爲這篇博文是關於另一個話題:使用EF Code Migrations播種數據。 我知道我可以添加任何屬性到我的用戶表(例如移動字符串),我的問題不是關於那個,而是關於重寫/自定義自動生成的SimpleMembership表的整個模式。 – Zsolt

2

這可能不是你的用例工作,但當然,你可以很輕鬆地添加用戶屬性的Simplemembership用戶配置表,而不是創建另一個用戶表的

我會建議使用現有的成員資格表以保留散列的密碼,並忽略不需要的字段。這種方式保持與SimpleMembership的兼容性,而不用大驚小怪。

SQLMembership非常容易開箱即用。我在幾個項目上做了大量的SQLMembership擴展定製擴展,這並不難 - 但是回頭看,我希望我沒有。這是一種維護麻煩,

2

您可以通過擴展MembershipProvider來創建自己的成員資格提供程序。有關更多詳細信息,請參閱Custom MembershipProvider in .NET 4.0。使用這種方法,你只需要實現你需要的方法。這應該有助於使事情更簡單,並且不需要添加不需要的表。

的基本步驟(摘自鏈接的SO回答)是:

  1. 創建一個新的類文件(如果你不使用多層系統,在項目的Models文件夾),讓我們把它MyMembershipProvider.cs
  2. 從System.Web.Security繼承該類。的MembershipProvider
  3. 自動地創建所需的方法(期+空間,在繼承類)
0

你可以同時使用自定義用戶與SimpleMembership表一起表。這種方法在過去對我很有幫助。

例如,在你的AccountController註冊方法,你會通過將用戶添加到您自己的用戶表中註冊一個新用戶。然後使用您添加到用戶表中的用戶的ID將此用戶添加到SimpleMembership UserProfile表中。

using (var context = new MyDatabaseEntities()) 
{ 
    User newUser = new User(){ 
     Name = model.Name, 
     Email = model.Email, 
     IsDeleted = false 
    } 

    // Add the user to your custom Users table 
    context.Users.Add(newUser); 
    context.SaveChanges(); 

    // Add this user to the SimpleMembership table using the same Id as the custom Users table 
    WebSecurity.CreateUserAndAccount(newUser.Id.ToString(), model.Password); 

    // Log the user in 
    WebSecurity.Login(newUser.Id.ToString(), model.Password); 
}