User.IsInRole return 错误

User.IsInRole return false

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

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

但这总是 return 错误,我已经在网络配置中设置了 <roleManager enabled="true" />。 请帮忙。

我刚刚让它与我的设置一起工作,该设置也使用身份框架。

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

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

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

然后在那之后的任何时候,当我 运行 User.IsInRole("Customers"); 它返回 false,直到我重新登录它们。

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

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

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);

自从我自定义 IdentityDbContext class 后,我遇到了同样的问题。在我的案例中 User.IsInRole("Customers") 始终为假的原因是因为我在我的自定义上下文 class 上关闭了 EF 延迟加载。我尝试打开延迟加载,然后注销然后再登录,User.IsInRole 返回预期值。

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

对我来说,问题出在启动 class 我没有像这样注册角色商店

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

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

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

最近我在我的案例中遇到了同样的问题,我是 运行 没有 SSl 的应用程序,所以我的浏览器拒绝 cookies 运行 启用 SSL 后的应用程序为我解决了这个问题