【发布时间】:2011-04-21 22:00:31
【问题描述】:
【问题讨论】:
标签: c# asp.net roleprovider
【问题讨论】:
标签: c# asp.net roleprovider
这是您需要在 MVC5 及更高版本中放入帐户控制器的代码 获取用户的角色列表:
csharp
public async Task<ActionResult> RoleAdd(string UserID)
{
return View(await
UserManager.GetRolesAsync(UserID)).OrderBy(s => s).ToList());
}
无需使用Roles.GetRolesForUser() 并启用角色管理器功能。
【讨论】:
<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>
【讨论】:
如果你使用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>());
【讨论】:
您可以通过读取布尔属性来做到这一点:
System.Web.Security.Roles.Enabled
这是从web.config 中roleManager 元素的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.
roleManager 被启用。但现在我得到了异常Unable to connect to SQL Server database
由于其中提到的异常,我发现了这个问题。我的 Web.Config 没有任何 <roleManager> 标签。我意识到即使我添加了它(如Infotekka suggested),它最终也会出现数据库异常。在遵循此处其他答案中的建议后,没有一个能完全解决问题。
由于这些Web.Config标签是可以自动生成的,所以通过手动添加来解决感觉不对。如果您遇到类似情况,请撤消您对 Web.Config 和 Visual Studio 所做的所有更改:
检查您的 Web.config,现在您应该在 Profile、Membership、SessionState 标签内至少有一个 <providers> 标签,并且在新的 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>
像这样添加enabled="true":
<roleManager defaultProvider="DefaultRoleProvider" enabled="true">
按 F6 构建,现在应该可以继续进行数据库更新而不会出现该异常:
update-database -verbose,Seed 方法将运行良好(如果您没有在其他地方搞砸的话)并在您的数据库中创建一些表;【讨论】:
如果您是因为使用新的ASP.NET Identity UserManager 而来到这里的,那么您实际上正在寻找的是RoleManager:
var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext()));
roleManager 将允许您查看角色是否存在、创建等,另外它是为UserManager 创建的
【讨论】:
我在其他地方通过 Google 找到了 2 条建议,建议 a) 确保您的 db 连接字符串(Roles 正在使用的那个)正确,并且它的密钥拼写正确,以及 b) RoleManager 上的 Enabled 标志已设置为真。希望其中之一有所帮助。它对我有用。
您是否尝试检查 Roles.Enabled?此外,您可以检查 Roles.Providers 以查看有多少提供程序可用,并且您可以检查 Roles.Provider 以获得默认提供程序。如果为空,则没有。
【讨论】: