我想加入我的工作,使用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中刪除該行。 但是我再次添加該行,然後在嘗試登錄時重新加載頁面。
問題是什麼?
您應該標記爲答案,以便將問題從未答覆的問題中刪除。很高興你找到了解決方案。 – JPK
哦,對不起。我標記了它。謝謝! – patr1c1a