尚未启用角色管理器功能

gsh*_*arp 190 c# asp.net roleprovider

得到以下ProviderException:

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

到现在为止还挺好.

是否有某个方法可以调用以检查角色管理器是否已启用?

Inf*_*kka 296

您可以通过读取布尔属性来执行此操作:

System.Web.Security.Roles.Enabled
Run Code Online (Sandbox Code Playgroud)

这是从元素的enabled属性直接读取:roleManagerweb.config

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


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

  • 将以上内容添加到web.config后,将启用`roleManager`.但现在我得到异常`无法连接到SQL Server数据库` (16认同)
  • @Infotekka“无法连接到 SQL Server 数据库”错误。 (2认同)
  • 哇,这是一个很好的答案,我什至不需要配置任何东西,就像一个魅力。在 web.config 中配置后,我可以检查 User.Identity.IsAuthenticated 以查看登录用户是否已通过身份验证。好酷的asp.net (2认同)

Ser*_*gan 52

如果你来到这里因为你正在使用新的ASP.NET Identity UserManager,那么你真正想要的是RoleManager:

var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext()));
Run Code Online (Sandbox Code Playgroud)

roleManager 将为您提供访问权限,以查看角色是否存在,创建等,以及是否为该角色创建 UserManager

  • 3岁的孩子与什么有什么关系?我接到了谷歌的这篇文章,因为我正在处理设置身份的问题.自从我弄清楚了......下一个处理与谷歌相同问题的人将知道该做什么...... (73认同)
  • 不是真的帖子已经3岁了;-) (3认同)
  • 此外,身份 UserManager 有一个有用的功能来获取给定用户的角色: UserManager.GetRolesAsync(User.Identity.GetUserId()); (2认同)

New*_*que 11

我在其他地方通过Google找到了2条建议,建议a)确保你的数据库连接字符串(Roles正在使用的那个)是正确的,并且它的密钥拼写正确,并且b)RoleManager上的Enabled标志设置为true.希望其中一个有所帮助.它对我有用.

您是否尝试过检查Roles.Enabled?此外,您可以检查Roles.Providers以查看可用的提供程序数量,您可以检查默认提供程序的Roles.Provider.如果它为null则没有.


CPH*_*hon 8

由于其中提到的例外,我发现了这个问题.我的Web.Config没有任何<roleManager>标签.我意识到,即使我添加它(如Infotekka建议的那样),它最终也会出现在数据库异常中.按照这里其他答案中的建议后,没有一个完全解决问题.

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

  1. Ctrl+ Q,键入nuget并单击"Manage NuGet Packages";
  2. Ctrl+ E,键入提供程序,在列表中它应显示"Microsoft ASP.NET Universal Providers Core Libraries "和"Microsoft ASP.NET Universal Provider for LocalDB "(均由Microsoft创建);
  3. 单击它们中的Install按钮并关闭NuGet窗口;
  4. 检查您的Web.config,现在您应该<providers>Profile,Membership,SessionState标记内以及新的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>
    
    Run Code Online (Sandbox Code Playgroud)
  5. enabled="true"像这样添加:

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

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

  • “_由于 Web.Config 字段是自动生成的_”这并不完全正确。虽然许多 NuGet 包会自动调整配置文件,但没有规定规则要求它们这样做。 (2认同)

Ogg*_*las 5

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

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

var roles = userManager.GetRoles(User.Identity.GetUserId());
Run Code Online (Sandbox Code Playgroud)

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

var roles = userManager.GetRoles(User.Identity.GetUserId<int>());
Run Code Online (Sandbox Code Playgroud)