【问题标题】:The Role Manager feature has not been enabled角色管理器功能尚未启用
【发布时间】:2011-04-21 22:00:31
【问题描述】:

得到以下ProviderException

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

到目前为止一切顺利。

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

【问题讨论】:

    标签: c# asp.net roleprovider


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:
      <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>
      

      【讨论】:

        【解决方案3】:

        如果你使用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>());
        

        【讨论】:

        • 这对我有用。如果您投反对票,请说明原因。
        • 这不起作用,因为您需要将 userid 转换为 int,这样:userManager.GetRoles(Convert.ToInt32(User.Identity.GetUserId()));
        • @toy 不, 将获取值作为 int。无需转换。当然,要使其正常工作,身份密钥需要是 int。
        【解决方案4】:

        您可以通过读取布尔属性来做到这一点:

        System.Web.Security.Roles.Enabled
        

        这是从web.configroleManager 元素的enabled 属性直接读取的:

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


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

        【讨论】:

        • 如何从代码而不是 web.config 执行此操作?我试着把它放在Application_Start,它说This method can only be called during the application's pre-start initialization phase.
        • 这在 web.config 中的什么位置?
        • 在上面添加到 web.config 之后,roleManager 被启用。但现在我得到了异常Unable to connect to SQL Server database
        • @Infotekka“无法连接到 SQL Server 数据库”错误。
        • 哇,这是一个很好的答案,我什至不需要配置任何东西,就像一个魅力一样。在 web.config 中配置后,我可以检查 User.Identity.IsAuthenticated 以查看登录用户是否经过身份验证。太酷了 asp.net
        【解决方案5】:

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

        由于这些Web.Config标签是可以自动生成的,所以通过手动添加来解决感觉不对。如果您遇到类似情况,请撤消您对 Web.Config 和 Visual Studio 所做的所有更改:

        1. Ctrl+Q,输入nuget并点击“管理NuGet包”;
        2. Ctrl+E,输入 providers 并在列表中显示“Microsoft ASP.NET Universal Providers Core库”和“Microsoft ASP.NET Universal Providers for LocalDB”(均由 Microsoft 创建);
        3. 点击两者中的安装按钮,关闭 NuGet 窗口;
        4. 检查您的 Web.config,现在您应该在 ProfileMembershipSessionState 标签内至少有一个 &lt;providers&gt; 标签,并且在新的 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,输入ma​​nager,点击“Package Manager Console”;
          2. 键入update-database -verbose,Seed 方法将运行良好(如果您没有在其他地方搞砸的话)并在您的数据库中创建一些表;
          3. Ctrl+W+L 打开服务器资源管理器,您应该能够签入 Data Connections > DefaultConnection > 表 新创建的表中的 RolesUsersInRoles 表!

        【讨论】:

        • "由于 Web.Config 字段是自动生成的" 这并不完全正确。虽然许多 NuGet 包会自动调整配置文件,但没有设置规则要求它们这样做。
        • 这是完美的。谢谢
        【解决方案6】:

        如果您是因为使用新的ASP.NET Identity UserManager 而来到这里的,那么您实际上正在寻找的是RoleManager

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

        roleManager 将允许您查看角色是否存在、创建等,另外它是为UserManager 创建的

        【讨论】:

        • 3岁的孩子有什么关系?我被谷歌带到了这篇文章,因为我正在处理设置身份的问题。既然我想通了...下一个与我处理相同问题的人被 Google 带到这里会知道该怎么做...
        • 另外,Identity UserManager 有一个有用的功能来获取给定用户的角色:UserManager.GetRolesAsync(User.Identity.GetUserId());
        • 你把 var roleManager = new RoleManager(new RoleStore(new ApplicationDbContext())); ?
        • 您可以在应用程序的任何位置进行操作。您显然需要解析一些引用,但在身份应用程序中需要角色的任何地方,您都可以使用此语句。
        【解决方案7】:

        我在其他地方通过 Google 找到了 2 条建议,建议 a) 确保您的 db 连接字符串(Roles 正在使用的那个)正确,并且它的密钥拼写正确,以及 b) RoleManager 上的 Enabled 标志已设置为真。希望其中之一有所帮助。它对我有用。

        您是否尝试检查 Roles.Enabled?此外,您可以检查 Roles.Providers 以查看有多少提供程序可用,并且您可以检查 Roles.Provider 以获得默认提供程序。如果为空,则没有。

        【讨论】:

        • 感谢您的回答。但这不是我想要的。我想要一种方法来检查角色管理器功能是否启用,而不为此目的缓存 ProviderException。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-21
        • 2014-05-10
        • 2013-08-25
        • 2013-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多