2014-02-24 113 views
1

我想加入我的工作,使用VS2013現有的ASP.NET(C#,MVC4)項目角色的認證。啓用asp.net角色編程

我有一個類似的問題在一年前以不同的項目,我設法解決,但現在我已經做了同樣的事情,並沒有任何反應:Seeding data and creating/managing roles in MVC4 - how hard can it be?

這就是我這樣做遠:

1.我有我自己的DataContext類,取代自帶的支架默認的UserContext類:

public class DataContext : DbContext 
{ 
    public DataContext() : base("DefaultConnection") 
    { 
    } 

public DbSet<UserProfile> UserProfiles { get; set; } 
} 

2.我在初始lizer I類加入此:

public class DataContextDbInitializer : DropCreateDatabaseIfModelChanges<DataContext> 
{ 
protected override void Seed(DataContext context) 
{ 
    if (!Roles.RoleExists("Admins")) 
    { 
       Roles.CreateRole("Admins"); 
    } 
    if (!WebSecurity.UserExists("admin")) 
    { 
       WebSecurity.CreateUserAndAccount("admin", "123456"); 
    } 
    if (!Roles.GetRolesForUser("admin").Contains("Admins")) 
    { 
       Roles.AddUsersToRoles(new[] { "admin" }, new[] { "Admins" }); 
    } 
    base.Seed(context); 
} 

3.添加這些行向的Application_Start()方法在Global.asax中:

WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true); 
Database.SetInitializer(new DataContextDbInitializer()); 
DataContext c = new DataContext(); 
c.Database.Initialize(true); 

4.從刪除了[InitializeSimpleMembership]註釋的AccountController,這樣我就可以從應用程序生命週期的開始初始化(在App_Start使用WebSecurity.InitializeDatabaseConnection,正如我在3號已經解釋)

5.在web.config中我離開的認證方式爲表單(默認)和我的連接字符串看起來像這樣:

<connectionStrings> 
    <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=aspnet-consultorio;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnet-consultorio.mdf" providerName="System.Data.SqlClient" /> 
    </connectionStrings> 

我說這對System.Web標籤內部:

<roleManager enabled="true" cacheRolesInCookie="true" /> 

爲了測試一切正常,我添加了[授權(角色=「管理員」)]上,該目錄從DB的東西,在一個控制器的方法的頂部註釋。

  • 如果我運行這樣的應用程序,然後點擊用[Authorize]批註觸發方法的鏈接,我會得到一個登錄屏幕。我輸入用戶「admin」的有效憑證,並且頁面被重新加載而不會引發任何錯誤(沒有像「錯誤的用戶名」),例外或任何事情。
  • 如果我添加WebSecurity.InitializeDatabaseConnection( 「DefaultConnection」, 「用戶配置」, 「用戶ID」, 「用戶名」,autoCreateTables:真);我的種子(DataContext的上下文)方法在我的初始化類中的第一行(前右「如果」創建角色開始),我試圖訪問受限制的methog時獲得相同的行爲(顯示登錄屏幕並重新加載每次輸入有效憑證)。
  • 如果我刪除WebSecurity.InitializeDatabaseConnection( 「DefaultConnection」, 「用戶配置」, 「用戶ID」, 「用戶名」,autoCreateTables:真);在Global.asax中的Application_Start方法行,然後嘗試登錄時,我得到一個System.InvalidOperationException: 它執行這個時候停止:如果(ModelState.IsValid & & WebSecurity.Login(model.UserName,模型。密碼,persistCookie:模型。RememberMe))裏面的公共ActionResult登錄(LoginModel模型,字符串returnUrl)方法在AccountController中。 錯誤消息顯示「在調用」WebSecurity「類的任何其他方法之前,您必須調用」WebSecurity.InitializeDatabaseConnection「方法。此調用應放置在您網站根目錄下的_AppStart.cshtml文件中。所以我認爲它不喜歡它,當我從Global.asax中刪除該行。 但是我再次添加該行,然後在嘗試登錄時重新加載頁面。

問題是什麼?

回答

0

那麼,我終於找到了問題,所以我在這裏發佈後代(也許在一年我會有同樣的問題,並會找到我自己的線程!) 代碼是好的。我只是有錯誤的數據庫管理方法:由於我的數據庫已經創建(這是一個現有的項目,我正在添加角色),Seed方法從未被調用過,因此將角色放在一邊。我只需切換到DropDatabaseAlways和voilá!

+0

您應該標記爲答案,以便將問題從未答覆的問題中刪除。很高興你找到了解決方案。 – JPK

+0

哦,對不起。我標記了它。謝謝! – patr1c1a