Authentication Can';t连接到数据库以执行标识功能

Authentication Can';t连接到数据库以执行标识功能,authentication,migration,asp.net-mvc-5,localdb,Authentication,Migration,Asp.net Mvc 5,Localdb,我已经使用ASP.NET MVC5创建了一个新的应用程序,使用单个用户帐户进行安全性迁移,并使用代码优先迁移进行模型/数据库建模。所有选项都是默认值 我想为它设置自定义用户和角色,所以我使用rolemanger和UserManager创建了一个种子来填充数据库。它工作正常,创建3个用户、3个角色,并正确设置每个用户的角色 我可以正确登录到应用程序。问题是我无法使用 User,它是已登录的用户,我只能得到User.Identity.IsAuthenticated值和User.Identity.Na

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

我想为它设置自定义用户和角色,所以我使用
rolemanger
UserManager
创建了一个种子来填充数据库。它工作正常,创建3个用户、3个角色,并正确设置每个用户的角色

我可以正确登录到应用程序。问题是我无法使用 User,它是已登录的用户,我只能得到
User.Identity.IsAuthenticated
值和
User.Identity.Name
,它们都是正确的。其他每个方法,如
Roles.GetRolesForUser(“John”)
,或
User.IsInRole(“Student”)
,都会生成此异常:

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

好吧,就像在中一样,我设法在Web.config中插入了
,现在需要很长时间才能响应,并生成如下异常:

指:

生成:

指:

生成:

使用登录的学生角色用户访问关于页面:

生成:

就像我根本没有连接到数据库一样,它是自动生成的LocalDB,我可以填充Seed方法,甚至可以登录到应用程序

我甚至可以从AspNetUsers表加载数据,并使用以下代码在视图中显示:

使用(Models.ApplicationDbContext db=new Models.ApplicationDbContext())
{
List Users=db.Users.ToList();
ViewBag.Users=用户;
}
返回视图();
请帮助:'(


这是种子代码,工作正常,因此它可以使用标识引擎连接到数据库

protected override void Seed(LocalBDAuthTest.Models.ApplicationDbContext上下文)
{
#区域创建角色学生、教师和管理员
var角色管理器=新角色管理器(新角色存储(上下文));
//学生
如果(!RoleManager.RoleExists(“学生”))
{
角色管理器。创建(新的身份(“学生”);
}
//老师
如果(!RoleManager.RoleExists(“教师”))
{
RoleManager.Create(新标识(“教师”);
}
//管理员
如果(!RoleManager.RoleExists(“管理员”))
{
RoleManager.Create(新标识文件(“管理员”);
}
#端区
#区域为学生、教师和管理员角色创建用户。
var UserManager=newusermanager(newuserstore(context));
//创建学生用户并将其角色设置为学生
如果(!context.Users.Any(u=>u.UserName==“John”))
{
var Student=newapplicationuser(){UserName=“John”};
var Result=UserManager.Create(学生,“123456”);
}
如果(!UserManager.FindByName(“John”).Roles.Any())
{
UserManager.AddToRole(UserManager.FindByName(“John”).Id,“Student”);
}
//创建教师用户并将其角色设置为教师
如果(!context.Users.Any(u=>u.UserName==“Arnold”))
{
var Teacher=newapplicationuser(){UserName=“Arnold”};
var Result=UserManager.Create(Teacher,“123456”);
UserManager.AddToRole(Teacher.Id,“Teacher”);
}
如果(!UserManager.FindByName(“Arnold”).Roles.Any())
{
UserManager.AddToRole(UserManager.FindByName(“Arnold”).Id,“Teacher”);
}
//创建管理员用户并将其角色设置为管理员
如果(!context.Users.Any(u=>u.UserName==“Caroline”))
{
var Administrator=newapplicationuser(){UserName=“Caroline”};
var Result=UserManager.Create(管理员,“123456”);
UserManager.AddToRole(Administrator.Id,“Administrator”);
}
如果(!UserManager.FindByName(“Caroline”).Roles.Any())
{
UserManager.AddToRole(UserManager.FindByName(“Caroline”).Id,“Administrator”);
}
#端区
}

这是由于ASP.NET身份和ASP.NET成员身份的混合,这是因为:

<system.web>
    <roleManager enabled="true" />
</system.web>
很可能您没有安装SQL Express,这就是为什么会出现超时和SQL异常


对于ASP.NET标识,不要使用
System.Web.Security.Roles
(它是ASP.NET成员资格的一部分),而是使用
Microsoft.AspNet.Identity.rolemanger

该死,你是对的!我从Web.config中删除了rolemanger表单。现在只剩下数据库连接错误。如果我将[Authorize(Roles=“rolename”)]在某些操作中,然后查看该操作,我得到长时间超时,在长时间等待之后,SqlExceptions和HttpExceptions表示它们无法连接到数据库。这怎么可能呢?我在最新版本中使用LocalDB,它已经安装,以及SQL Express和Visual Studio 2013 Ultimate,这应该与整个软件包一起提供e、 对吗?不确定您的确切设置,请重新检查您的web.config连接字符串并重新检查您的代码是否使用了连接密钥。这一定是您修改过的!还要注意,Authorize属性不应该命中数据库,它在当前
HttpContext
中对
IPrincipal
用户进行操作并进行迭代关于它里面的角色声明。哦,不知怎么的,我还在里面…搞定了!我把它修好了,现在我可以把我的头发重新插回我的脑袋了哈哈,谢谢兄弟!真遗憾,我不能因为我的声誉而投票支持你的答案。
HttpException
Roles.GetRolesForUser(User.Identity.Name)
NullReferenceException
[Authorize(Roles="Teacher")]
public ActionResult About()
{
    ViewBag.Message = "Your application description page.";

    return View();
}
SqlException
HttpException
<system.web>
    <roleManager enabled="true" />
</system.web>
<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>