布局视图中的Roles.GetRolesForUser()不返回角色

时间:2015-05-29 17:38:31

标签: asp.net asp.net-mvc asp.net-identity asp.net-identity-2

剃刀布局视图中的

@Roles.GetRolesForUser()不返回角色。 @Roles.GetRolesForUser().Count()为0。

@Roles.IsUserInRole('name_of_logged_in_role')在相同位置的同一视图中返回true

Razor查看:

<p>
    @User.Identity.Name //Output: MyName
    @Roles.GetRolesForUser().Count()  //Output: 0
    @Roles.IsUserInRole("Radiologist")  //Output: True
</p>

更新

@Roles.GetRolesForUser(User.Identity.Name).Length //Output: 0
@Roles.GetRolesForUser(User.Identity.GetUserName()).Length //Output: 0

1 个答案:

答案 0 :(得分:6)

经过广泛的研究,我终于找到了问题所在。我能够在Web应用程序中重现该问题。显然,您无法将 ASP.NET标识简单成员资格结合使用,就像您使用GetRolesForUser方法一样。 {/ 1}}对象默认使用默认提供程序设置简单会员,但您似乎使用 ASP.NET身份而不是简单会员< / strong>即可。直到我想知道自己为什么不起作用时,我才发现差异。

你得到Roles的原因是因为string[0]对数据库中不存在的表执行了sql查询。
GetRolesForUser工作的原因或多或少,它甚至没有使用默认提供程序来检查它使用IsUserInRole

CacheRolesInCookie

因此,从技术上讲,它转到了默认提供程序列出的connectionString并返回If CacheRolesInCookie is true, then roleName may be checked against the roles cache rather than the specified role provider. ,因为数据库中没有该connectionString的数据。将当前数据库添加到提供程序也无济于事,因为简单成员数据库架构与 ASP.NET身份

不同

话虽这么说,你应该通过UserName获得这样的角色:

简单解决方案:

string[0]

<强>更新

扩展解决方案:

您可以在上下文中扩展 ASP.NET Identity 角色

http://www.codeproject.com/Articles/799571/ASP-NET-MVC-Extending-ASP-NET-Identity-Roles