【问题标题】:Roles.GetRolesForUser() in Layout view not returning roles布局视图中的 Roles.GetRolesForUser() 不返回角色
【发布时间】:2015-05-31 11:16:49
【问题描述】:

剃刀布局视图中的@Roles.GetRolesForUser() 未返回角色。 @Roles.GetRolesForUser().Count() 为 0。

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

剃刀视图:

<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

【问题讨论】:

  • 您是否在执行此布局之前更改角色?如果是这样,您可能会遇到用于 GetRolesForUser 的 cookie 角色缓存的问题。请参阅此处的 CacheRolesInCookie 部分:msdn.microsoft.com/en-us/library/8ak75t41(v=vs.110).aspx
  • 如果你这样做GetRolesForUser(username here),它会给你同样的结果吗?
  • @stephen.vakil 不,我不会改变角色。即使我在私人窗口中进行操作也保持不变。
  • @imGreg 是的,查看更新

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


【解决方案1】:

经过大量研究,我终于找到了问题所在。我能够在 Web 应用程序中重现该问题。显然,您不能将 ASP.NET Identity 与 Simple Membership 结合起来,就像使用 GetRolesForUser 方法那样。 Roles 对象默认设置为 Simple Membership 使用默认提供程序,但您似乎使用 ASP.NET Identity 而不是 Simple Membership。我什至没有注意到差异,直到我想知道为什么它不起作用。

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

If CacheRolesInCookie is true, then roleName may be checked against the roles cache rather than the specified role provider.

因此,从技术上讲,它转到默认提供程序列出的连接字符串并返回string[0],因为您在数据库中没有具有该连接字符串的数据。将您当前的数据库添加到提供程序也无济于事,因为 Simple Membership 数据库架构不同于 ASP.NET Identity

话虽如此,您应该像这样通过 UserName 获取角色:

简单的解决方案:

public List<string> GetRoles(string UserName)
{    List<string> roles = new List<string>();
    if (!string.IsNullOrWhiteSpace(UserName))
    {
        ApplicationUser user = context.Users.Where(u => u.UserName.Equals(UserName, StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault();
        var account = new AccountController();

        roles = account.UserManager.GetRoles(user.Id);         
    }            
    return roles;
}

更新

扩展解决方案:

您可以在您的上下文中扩展 ASP.NET 身份角色

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

【讨论】:

  • 我已经在我的应用程序中使用身份角色。我不知道 GetRolesForUser 属于简单会员。我仍然无法在布局视图中获得角色
  • @LifeH2O,当您使用其他帖子中的代码或您已经解决了问题时会发生什么?
  • GetRolesForUser 无论如何都会返回0。正如您所解释的,这样做是因为此方法属于SimpleMembership,而我使用Identity 来管理角色。因此,我使用该帖子中的代码在我的视图中显示角色,该视图使用UserManager 来获取角色。
猜你喜欢
  • 1970-01-01
  • 2017-04-11
  • 2011-05-27
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-01
相关资源
最近更新 更多