有关User.IsInRole的问题很多,但我找不到正确的答案。
我需要通过使用AuthorizationHandler(通过授权要求)来验证特定角色
我有一个ASP.NET Core 2.1项目,其中有“个人用户帐户”。我已经为数据库添加了种子,并使用userManager.AddToRoleAsync
将用户添加到一个角色(一个角色),是的,数据库显示了用户,角色和它们之间的连接。
我创建了一个CandidateViewHandler来控制View-Contorller的授权。它看起来如下
public class CandidateViewHandler : AuthorizationHandler<ViewCandidateRequirement, Candidate>
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, ViewCandidateRequirement requirement, Candidate resource)
{
if (context.User.Identity.IsAuthenticated)
{
if (resource.Email == context.User.FindFirst(ClaimTypes.Name).Value)
{
context.Succeed(requirement);
}
else
{
bool IsAdmin = context.User.IsInRole("Administrator");
bool IsSearch = context.User.IsInRole("Searcher");
if (IsAdmin == true || IsSearch == true)
{
context.Succeed(requirement);
}
}
}
return Task.CompletedTask;
}
}
但是,IsAdmin
和IsSearch
总是返回false
。即使在控制器中对其进行测试,结果也保持不变。我应该在2.1中使用Claims
吗?如果可以,怎么办?
答案 0 :(得分:1)
将您的角色类型声明添加到 AspNetUserClaims 表中。默认的role claim type是http://schemas.microsoft.com/ws/2008/06/identity/claims/role
。该类型的任何声明都应自动映射为角色,以便可以与 IsInRole 一起使用。
您还可以在客户端中使用自定义映射:
services.AddAuthentication()
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
RoleClaimType = "role",
NameClaimType = "name",
};
});
旁注,您可能会考虑不再使用角色,因为asp.net核心具有许多更高级的功能可用于授权。
答案 1 :(得分:0)
显然,ASP.NET CORE 2.1在处理角色https://github.com/aspnet/Identity/issues/1813时遇到问题,如该线程中所述。仍然存在关于如何用Claims替换Roles的问题。
解决方法是回退到startup
文件中的旧配置:
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultUI()
.AddDefaultTokenProviders()
(因此,删除AddDefaultIdentity<ApplicationUser>.AddRole<ApplicationRole>
并替换为AddIdentity<AppplicationRole, ApplicationUser>
。现在一切正常。