2014-01-16 64 views
2

我已經使用ASP.NET MVC5創建了一個新的應用程序,使用個人用戶帳戶進行模型/數據庫建模的安全和代碼優先遷移。所有選項都是默認值。無法連接到數據庫以執行標識功能

我想要設置自定義用戶和角色,因此我使用RoleManagerUserManager創建了一個種子來填充數據庫。它工作正常,創建3個用戶,3個角色並正確設置每個用戶的角色。

我可以正確登錄到應用程序。問題是我無法執行任何使用 用戶(這是記錄的用戶)的身份識別方法,唯一能得到的是User.Identity.IsAuthenticated值和User.Identity.Name,這是正確的。像Roles.GetRolesForUser("John"),或User.IsInRole("Student")其他每個方法,總是生成此異常:

ProviderException:角色管理器功能尚未啓用。

所以沒關係,在this article,我設法插入在Web.config中的<roleManager enabled="true" />,而現在它需要很長的時間來響應,併產生像例外:

參考:

Roles.IsUserInRole("Student") 

生成:

HttpException 

參考:

Roles.GetRolesForUser(User.Identity.Name) 

生成:

NullReferenceException 

訪問關於頁面記錄在學生角色的用戶:

[Authorize(Roles="Teacher")] 
public ActionResult About() 
{ 
    ViewBag.Message = "Your application description page."; 

    return View(); 
} 

生成:

SqlException 
HttpException 

這就像我根本沒有連接到數據庫,這是LocalDB,自動生成,我可以填充種子方法,甚至使登錄到應用程序。

我甚至可以從AspNetUsers表加載數據,並使用下面的代碼顯示它在視圖:

using (Models.ApplicationDbContext db = new Models.ApplicationDbContext()) 
{ 
    List<Models.ApplicationUser> Users = db.Users.ToList(); 

    ViewBag.Users = Users; 
} 

return View(); 

請幫助:'(


這裏的種子代碼,工作正常,所以它可以使用標識引擎連接到數據庫。

protected override void Seed(LocalBDAuthTest.Models.ApplicationDbContext context) 
{ 
    #region Create Roles Student, Teacher e Administrator 

    var RoleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context)); 

    // Student 
    if (!RoleManager.RoleExists("Student")) 
    { 
     RoleManager.Create(new IdentityRole("Student")); 
    } 

    // Teacher 
    if (!RoleManager.RoleExists("Teacher")) 
    { 
     RoleManager.Create(new IdentityRole("Teacher")); 
    } 

    // Administrator 
    if (!RoleManager.RoleExists("Administrator")) 
    { 
     RoleManager.Create(new IdentityRole("Administrator")); 
    } 

    #endregion 

    #region Create Users for Student, Teacher e Administrator Roles. 

    var UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context)); 


    // Create a Student user and set it's role to Student 
    if (!context.Users.Any(u => u.UserName == "John")) 
    { 
     var Student = new ApplicationUser() { UserName = "John" }; 
     var Result = UserManager.Create(Student, "123456"); 
    } 
    if (!UserManager.FindByName("John").Roles.Any()) 
    { 
     UserManager.AddToRole(UserManager.FindByName("John").Id, "Student"); 
    } 


    // Create a Teacher user and set it's role to Teacher 
    if (!context.Users.Any(u => u.UserName == "Arnold")) 
    { 
     var Teacher = new ApplicationUser() { UserName = "Arnold" }; 
     var Result = UserManager.Create(Teacher, "123456"); 
     UserManager.AddToRole(Teacher.Id, "Teacher"); 
    } 
    if (!UserManager.FindByName("Arnold").Roles.Any()) 
    { 
     UserManager.AddToRole(UserManager.FindByName("Arnold").Id, "Teacher"); 
    } 


    // Create a Administrator user and set it's role to Administrator 
    if (!context.Users.Any(u => u.UserName == "Caroline")) 
    { 
     var Administrator = new ApplicationUser() { UserName = "Caroline" }; 
     var Result = UserManager.Create(Administrator, "123456"); 
     UserManager.AddToRole(Administrator.Id, "Administrator"); 
    } 
    if (!UserManager.FindByName("Caroline").Roles.Any()) 
    { 
     UserManager.AddToRole(UserManager.FindByName("Caroline").Id, "Administrator"); 
    } 

    #endregion 
    } 

回答

4

這是由於混合了兩種ASP。NET身份和ASP.NET的成員,已經做到了這一點:

<system.web> 
    <roleManager enabled="true" /> 
</system.web> 

您啓用會員SqlRoleProvider,這在你的網站上的\文件夾APP_DIR使用默認的SQL Express實例的角色存儲在數據庫中。

如果你打開你的machine.config中,你會發現:

<connectionStrings> 
    <add name="LocalSqlServer" 
    connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI; 
     AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" 
     providerName="System.Data.SqlClient"/> 
</connectionStrings> 
. 
. 
. 
<roleManager> 
    <providers> 
    <add name="AspNetSqlRoleProvider" connectionStringName="LocalSqlServer" ... 
</providers> 
</roleManager> 

最有可能你沒有安裝SQL Express的做的,這就是爲什麼你得到超時和SQL異常。

對於ASP.NET身份不要使用System.Web.Security.Roles(它是ASP.NET成員身份的一部分),而是使用Microsoft.AspNet.Identity.RoleManager來代替。

+0

該死的,你是對的!我抹掉了roleManager表單Web.config。現在它只留下數據庫連接錯誤。如果我在某些Action中放置了[Authorize(Roles =「rolename」)]],那麼進入該Action的視圖,我得到很長的超時,並且在經過漫長的等待之後,SqlExceptions和HttpExceptions,說他們無法連接到數據庫。這怎麼可能?我使用LocalDB的最新版本,安裝了SQL和Express Visual Studio 2013 Ultimate,它們應該包含整個軟件包,對不對? –

+0

不確定你的確切設置,重新檢查你的web.config連接字符串還重新檢查你的代碼中使用的連接鍵。它必須是你已經修改的東西! –

+0

還要注意Authorize屬性不應該命中數據庫,它在當前的'HttpContext'中對'IPrincipal' User進行操作,並迭代存儲在其中的角色聲明。 –