在我的aspnet核心MVC应用程序中,如果我使用注入的UserManager
检索用户,则以下返回true
:
await _userManager.IsInRoleAsync( user, "Administrator" );
但是,每当我在这样的视图中检查User
(ClaimsPrincipal
)时,声明就会丢失(返回false
):
User.IsInRole( "Administrator" );
这似乎与我不一致。
我是否必须在某个地方手动设置“角色声明”?我想这将是免费的,并且自定义UserClaimsPrincipalFactory
将用于特定于应用程序的声明,而不是角色(随MVC一起提供)。
我想念什么?
答案 0 :(得分:0)
这是2.1版本中的一个已知问题,并已在2.2 Preview-1中修复。
在asp.net核心2.1中,使用AddDefaultIdentity
并且注入变为
services.AddDefaultIdentity<IdentityUser>()
.AddRoles<IdentityRole>()
,默认情况下不会启用Roles
,并且对于User.IsInRole
总是返回false。
要绕过它,而不是使用新的AddDefaultIdentity<TUser>()
来配置Identity,只需使用旧式api即可:
services.AddIdentity<IdentityUser, IdentityRole>()
.AddRoleManager<RoleManager<IdentityRole>>()
.AddDefaultUI()
.AddDefaultTokenProviders()
.AddEntityFrameworkStores<ApplicationDbContext>();
另一种方法是,您可以将UserClaimsPrincipal工厂替换为角色识别工厂。在ConfigureService中添加以下代码,并参考UserRoles in DefaultIdentity
services.AddScoped<IUserClaimsPrincipalFactory<IdentityUser>, UserClaimsPrincipalFactory<IdentityUser, IdentityRole>>();