无法连接到数据库以执行身份功能

时间:2014-01-16 19:00:19

标签: authentication migration asp.net-mvc-5 localdb

我使用ASP.NET MVC5创建了一个新的应用程序,使用个人用户帐户进行模型/数据库建模的安全性和代码优先迁移。所有选项都是默认选项。

我想为其设置自定义用户和角色,因此我使用RoleManagerUserManager创建了一个种子,只是为了填充数据库。它工作正常,创建3个用户,3个角色并正确设置每个用户的角色。

我可以正确登录该应用程序。问题是我无法使用。执行任何Identity方法 用户,即已登录的用户,我唯一能得到的是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表加载数据,并使用以下代码在View中显示:

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

    ViewBag.Users = Users;
}

return View();

请帮助:'(


这是种子代码,它运行正常,因此它可以使用Identity引擎连接到数据库。

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
    }

1 个答案:

答案 0 :(得分: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