角色管理器功能尚未启用


192

得到了以下ProviderException

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

到目前为止,一切都很好。

是否可以调用某个方法来检查Role Manager是否已启用?

Answers:


302

您可以通过从以下boolean属性中读取内容来实现:

System.Web.Security.Roles.Enabled

这是直接从中enabledroleManager元素的属性中读取的内容web.config

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


更新:
有关更多信息,请查看此MSDN示例:https : //msdn.microsoft.com/zh-cn/library/aa354509(v=vs.110).aspx


1
我该如何用代码代替web.config呢?我尝试将其放进去,Application_Start并说This method can only be called during the application's pre-start initialization phase.
马斯洛(Maslow)

1
这在web.config中去了哪里?
Matt Connolly13年

17
将以上内容添加到web.config后roleManager 启用。但现在我越来越例外Unable to connect to SQL Server database
Irfan Yusanif '16

2
@Infotekka“无法连接到SQL Server数据库”错误。
杰克

2
哇,这是一个很好的答案,我什至不必配置任何东西,就像一个魅力一样。在web.config中配置后,我只需检查User.Identity.IsAuthenticated即可查看登录用户是否已通过身份验证。真酷的asp.net
Quan

52

如果您是因为使用新产品而来到这里ASP.NET Identity UserManager,那么您真正要寻找的是RoleManager

var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext()));

roleManager 将使您能够查看角色是否存在,创建等,以及为该角色创建的角色 UserManager


73
三岁的孩子有什么关系?我从Google上读了这篇文章,因为我正在处理有关设置身份的问题。既然我知道了...下一个被谷歌带到我这里来处理与我相同的问题的人将知道该怎么做...
Serj Sagan 2014年

1
另外,Identity UserManager具有有用的功能来获取给定用户的角色:UserManager.GetRolesAsync(User.Identity.GetUserId());
keithl8041 2015年

您在哪里放置var roleManager = new RoleManager <IdentityRole>(new RoleStore <IdentityRole>(new ApplicationDbContext())); ?
马里奥·M

您可以在应用程序中的任何位置进行操作。您显然需要解析一些引用,但是在Identity应用程序中需要角色的任何地方,都可以使用此语句。
Serj Sagan

11

我在Google的其他地方找到2条建议,它们建议a)确保您的数据库连接字符串(角色正在使用的数据库连接字符串)正确且其键的拼写正确,以及b)RoleManager上的Enabled标志设置为true。希望这些帮助之一。它对我有用。

您是否尝试检查Roles.Enabled?另外,您可以检查Roles.Providers以查看有多少个可用的提供程序,也可以检查Roles.Provider中的默认提供程序。如果为null,则没有一个。


感谢您的回答。但这不是我想要的。我想要一个方法来检查是否启用了角色管理器功能,而不为此缓存ProviderException。
gsharp

8

我发现这个问题是由于其中提到的异常。我的Web.Config没有任何<roleManager>标签。我意识到,即使我添加了它(如Infotekka所建议),它最终也会出现数据库异常。遵循此处其他答案中的建议后,没有人完全解决问题。

由于可以自动生成这些Web.Config标记,因此手动添加它们来解决它是错误的。如果情况类似,请撤消对Web.Config和Visual Studio中所做的所有更改:

  1. Ctrl+ Q,键入nuget,然后单击“管理NuGet软件包”;
  2. Ctrl+ E,键入提供程序,并在列表中显示“ Microsoft ASP.NET通用提供程序核心库 ”和“ LocalDB的 Microsoft ASP.NET通用提供程序”(均由Microsoft创建);
  3. 单击两个安装按钮,然后关闭NuGet窗口;
  4. 检查您的Web.config,现在您应该<providers>ProfileMembershipSessionState标记以及新的RoleManager标记内至少有一个标记,如下所示:

    <roleManager defaultProvider="DefaultRoleProvider">
        <providers>
           <add name="DefaultRoleProvider" type="System.Web.Providers.DefaultRoleProvider, System.Web.Providers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=NUMBER" connectionStringName="DefaultConnection" applicationName="/" />
        </providers>
    </roleManager>
  5. enabled="true"像这样添加:

    <roleManager defaultProvider="DefaultRoleProvider" enabled="true">
  6. F6构建,现在应该可以继续进行数据库更新,而不会出现以下异常:

    1. Ctrl+ Q,输入manager,单击“ Package Manager Console”;
    2. Type update-database -verbose和Seed方法将正常运行(如果您没有在其他地方弄乱),并在数据库中创建一些表;
    3. Ctrl+ W+ L打开服务器资源管理器,你应该能够检查数据连接> DefaultConnection>表角色UsersInRoles新创建的表中的表!

1
由于Web.Config字段是自动生成的 ”这并不完全正确。虽然许多NuGet软件包会自动调整配置文件,但没有设置规则要求它们这样做。
凯文·R。

太棒了。Thnx
sapatelbaps

6

如果您正在使用,ASP.NET Identity UserManager也可以这样获得:

var userManager = Request.GetOwinContext().GetUserManager<ApplicationUserManager>();

var roles = userManager.GetRoles(User.Identity.GetUserId());

例如,如果您已将用户的密钥从Guid更改为Int,请使用以下代码:

var roles = userManager.GetRoles(User.Identity.GetUserId<int>());

这对我有用。请说一下为什么要拒​​绝。
Ogglas'7

这不起作用,因为您需要将userid强制转换为int,例如:userManager.GetRoles(Convert.ToInt32(User.Identity.GetUserId <int>()));
玩具

@toy不,<int>将获得int值。无需转换。当然,要使其正常工作,必须将身份密钥设置为int。
奥格拉斯'17

-1
<roleManager
  enabled="true"
  cacheRolesInCookie="false"
  cookieName=".ASPXROLES"
  cookieTimeout="30"
  cookiePath="/"
  cookieRequireSSL="false"
  cookieSlidingExpiration="true"
  cookieProtection="All"
  defaultProvider="AspNetSqlRoleProvider"
  createPersistentCookie="false"
  maxCachedResults="25">
  <providers>
    <clear />
    <add
       connectionStringName="MembershipConnection"
       applicationName="Mvc3"
       name="AspNetSqlRoleProvider"
       type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    <add
       applicationName="Mvc3"
       name="AspNetWindowsTokenRoleProvider"
       type="System.Web.Security.WindowsTokenRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
  </providers>
</roleManager>

-1

这是您需要在MVC5和更高版本中的帐户控制器中放入的代码,以获取用户角色列表:

csharp public async Task<ActionResult> RoleAdd(string UserID) { return View(await UserManager.GetRolesAsync(UserID)).OrderBy(s => s).ToList()); }

无需使用Roles.GetRolesForUser()和启用角色管理器功能。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.