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

Edg*_*zar 3 migration authentication localdb asp.net-mvc-5

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

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

我可以正确登录应用程序。问题是我无法使用User执行任何 Identity 方法 ,这是登录的 User ,我唯一能得到的是User.Identity.IsAuthenticated值和User.Identity.Name,这是正确的。每个其他方法,如Roles.GetRolesForUser("John"), or User.IsInRole("Student"),总是产生这个异常:

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

好吧,就像在本文中一样,我设法<roleManager enabled="true" />在 Web.config 中插入了,现在响应需要很长时间,并生成如下异常:

参考:

Roles.IsUserInRole("Student")
Run Code Online (Sandbox Code Playgroud)

产生:

HttpException
Run Code Online (Sandbox Code Playgroud)

参考:

Roles.GetRolesForUser(User.Identity.Name)
Run Code Online (Sandbox Code Playgroud)

产生:

NullReferenceException
Run Code Online (Sandbox Code Playgroud)

以学生角色登录访问“关于”页面:

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

    return View();
}
Run Code Online (Sandbox Code Playgroud)

产生:

SqlException
HttpException
Run Code Online (Sandbox Code Playgroud)

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

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

Roles.IsUserInRole("Student")
Run Code Online (Sandbox Code Playgroud)

请帮忙 :'(


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

HttpException
Run Code Online (Sandbox Code Playgroud)

MK.*_*MK. 5

这是因为混合了 ASP.NET Identity 和 ASP.NET Membership,这样做了:

<system.web>
    <roleManager enabled="true" />
</system.web>
Run Code Online (Sandbox Code Playgroud)

您启用了成员资格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>
Run Code Online (Sandbox Code Playgroud)

很可能您没有安装 SQL Express,这就是您收到超时和 SQL 异常的原因。

对于 ASP.NET Identity 不要使用System.Web.Security.Roles(它是 ASP.NET Membership 的一部分),而是使用Microsoft.AspNet.Identity.RoleManager