我在mvc 5网站上使用Identity 2进行身份验证。在我看来,我想检查用户的角色:
@if(User.IsInRole("Customers"))
{
@*do something*@
}
但是这总是返回false,我已经在web配置中设置了<roleManager enabled="true" />
。
请帮助。
答案 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