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 后的应用程序为我解决了这个问题
我在 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 后的应用程序为我解决了这个问题