1

在我的項目中,我使用WebSecurity和EF代碼優先遷移。WebSecurity.InitializeDatabaseConnection不配合代碼優先遷移

我有我的自定義UserProfile類我想與WebSecurity結合。

我想要種子用戶在Seed方法的遷移配置類中。

所以我試試這個:

#1) 
if (!Roles.RoleExists("admin")) 
      Roles.CreateRole("admin"); 

if (!WebSecurity.UserExists(AdminUserName)) 
    WebSecurity.CreateUserAndAccount(
     AdminUserName, 
     "admin", 
     new {Email = "[email protected]"}); 

但抱怨說我應該先打電話WebSecurity.InitializeDatabaseConnection。

好的,這是有道理的。所以我添加以下行到我的Global.asax:

#2) 
WebSecurity.InitializeDatabaseConnection(
    _connectionStringName, 
    "UserProfiles", 
    "Id", 
    "UserName", 
    autoCreateTables: true); 

但比下面幾行:

#3) 
var dbMigrator = new DbMigrator(_configuration); 
dbMigrator.Update(); 

拋出錯誤:

There is already an object named 'UserProfiles' in the database.

那麼,這又是有道理的遷移嘗試創建剛剛由WebSecurity創建的表。

我發現了一個解決方法:我把#2)放在#1的右上方)。比它的工作。

  1. 遷移創建的UserProfiles表
  2. WebSecurity連接到現有的UserProfiles表,創建它需要
  3. 種子工程,因爲他們發現所需的表及WebSecurity被初始化其他表。

問題是我必須初始化種子方法內的WebSecurity,這是有點臭。

我的問題是如何將WebSecurity.InitializeDatabaseConnection移回Global.asax?

+0

您的網站應該在有限的操作系統和運行大tabase特權。如果沒有,那麼黑客有可能使用漏洞修改存儲過程,觸發器等。因此,數據庫遷移(操作數據庫的模式)應該可以在Web應用程序進程之外使用特權帳戶完成。我知道它並不總是可能的(又名託管解決方案),但是要牢記這些風險。 – bloudraak

回答

4

,你可以這樣寫代碼Global.asax

if (!WebMatrix.WebData.WebSecurity.Initialized) 
       WebSecurity.InitializeDatabaseConnection(_connectionStringName, "UserProfile", "UserId", "UserName", autoCreateTables: true); 

然後播種,使用遷移你做這樣一來,在這裏你可以把喜歡的電子郵件您的自定義字段,...:

private void SeedMemberShip() 
{ 
    if (!WebMatrix.WebData.WebSecurity.Initialized) 
     WebSecurity.InitializeDatabaseConnection(_connectionStringName, "UserProfile", "UserId", "UserName", autoCreateTables: true); 
    var roles = (SimpleRoleProvider)Roles.Provider; 
    var membership = (SimpleMembershipProvider)Membership.Provider; 
    if (!roles.RoleExists("Admin")) 
    { 
     roles.CreateRole("Admin"); 
    } 

    if (membership.GetUser(username, false) == null) 
    { 
     membership.CreateUserAndAccount(username, password); 
    } 

    if (!roles.GetRolesForUser(username).Contains("Admin")) 
    { 
     roles.AddUsersToRoles(new[] { username }, new[] { "Admin" }); 
    } 
} 

然後調用上面的方法是種方法:

protected override void Seed(YourContext context) 
     { 

      SeedMemberShip(); 
     }