User.IsInRole返回false

时间:2015-05-21 09:04:25

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

我在mvc 5网站上使用Identity 2进行身份验证。在我看来,我想检查用户的角色:

@if(User.IsInRole("Customers"))
{
  @*do something*@
}

但是这总是返回false,我已经在web配置中设置了<roleManager enabled="true" />。 请帮助。

4 个答案:

答案 0 :(得分:7)

我刚刚使用了同样使用Identity Framework的设置。

我使用以下代码将用户添加到角色:

this.RoleManager.CreateAsync(new Role() {Name  = "Customers"});

this.UserManager.AddToRoleAsync(this.User.Identity.GetUserId<int>(), "Amazing");

然后在那之后的任何时候,当我跑User.IsInRole("Customers");时,它返回false,直到我重新将它们重新插入。

将用户添加到角色后,您需要重新登录用户。角色信息存储在cookie中。

我运行以下内容再次登录用户:

var user = await this.UserManager.FindByNameAsync("bob");
var identity = await this.UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);

this.AuthManager.SignIn(new AuthenticationProperties() { IsPersistent = true }, identity);

从这时起,User.IsInRole("Customers")为我工作并返回true

除非您可以在应用程序中验证它是否知道要将其添加到的角色,否则这将无效。您可以通过以下方式使用RoleManager验证角色“Customers”的存在:

var roleExists = (this.RoleManager.FindByNameAsync("Customers").Result != null);

答案 1 :(得分:1)

自定义IdentityDbContext类以来,我遇到了同样的问题。在我的情况下,User.IsInRole("Customers")总是错误的原因是因为我在自定义上下文类中关闭了EF延迟加载。我试图打开延迟加载而不是我退出然后进入,User.IsInRole返回预期值。

public partial class Context : IdentityDbContext<User>
    {
        public Context() : base("name=Context")
        {
            this.Configuration.LazyLoadingEnabled = true;          
        }

答案 2 :(得分:1)

对我来说,问题出在启动类中,我没有这样注册角色存储

services.AddDefaultIdentity<ApplicationUser>() .AddEntityFrameworkStores<ApplicationDbContext>();

所以只需添加.AddRoles<IdentityRole>()即可为我解决问题

services.AddDefaultIdentity<ApplicationUser>() .AddRoles<IdentityRole>() .AddEntityFrameworkStores<ApplicationDbContext>();

答案 3 :(得分:0)

最近我遇到了同样的问题,我在没有 SSl 的情况下运行应用程序,因此在启用 SSL 为我解决了这个问题后,我的浏览器拒绝了运行应用程序的 cookie