AspNetCore MVC声明-IsInRoleAsync verus声明

时间:2019-01-15 19:20:39

标签: asp.net-mvc asp.net-core

在我的aspnet核心MVC应用程序中,如果我使用注入的UserManager检索用户,则以下返回true

await _userManager.IsInRoleAsync( user, "Administrator" );

但是,每当我在这样的视图中检查UserClaimsPrincipal)时,声明就会丢失(返回false):

User.IsInRole( "Administrator" );

这似乎与我不一致。

我是否必须在某个地方手动设置“角色声明”?我想这将是免费的,并且自定义UserClaimsPrincipalFactory将用于特定于应用程序的声明,而不是角色(随MVC一起提供)。

我想念什么?

1 个答案:

答案 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>>();