评估授权为User.IsInRole()的角色的正确方法始终返回false

时间:2018-10-27 11:31:07

标签: asp.net-mvc asp.net-core asp.net-identity claims-based-identity

有关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;
    }
}

但是,IsAdminIsSearch总是返回false。即使在控制器中对其进行测试,结果也保持不变。我应该在2.1中使用Claims吗?如果可以,怎么办?

2 个答案:

答案 0 :(得分:1)

IMO查尔斯·德·M(Charles de M.)提到的讨论实际上表明,角色实际上是对身份的不必要补充。在我看来,将来最好删除 AspNetRoles 表(或至少不再使用它)并直接将角色用作声明,而不要具有将角色添加为声明的身份

将您的角色类型声明添加到 AspNetUserClaims 表中。默认的role claim typehttp://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>。现在一切正常。