ASP.NET Core 2.0 无法检查用户是否在 Razor 视图或控制器 [authorize] 注释中正确扮演角色

ASP.NET Core 2.0 unable to check if user is in role properly in Razor view or controller [authorize] annotation

我正在处理一个基于角色授权的遗留项目,但我遇到了一些问题。 User.IsInRole("admin")[Authorize(Roles = "admin")] 总是授权失败。 User.IsInRole() 总是 returns False。我很确定用户已正确添加到角色中。 Role name 'admin' is already taken.User already in role 'admin'.

也许某些服务正在影响另一个。

这是我的 startup.cs 恢复代码:

public void ConfigureServices(IServiceCollection services){

    services.AddDbContext<ApplicationDbContext>(options => options.UseMySql(connetctionString));

    services.AddIdentity<ApplicationUser, IdentityRole>()
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();

    services.AddScoped<IUserClaimsPrincipalFactory<ApplicationUser>, CustomUserClaimsPrincipalFactory>();
    services.AddMvc();
    services.AddDistributedMemoryCache();
    services.AddSession();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env){
    app.UseStaticFiles();
    app.UseAuthentication();
    app.UseMvc(routes => {...});
}

我错过了什么?

PS。是的,我登录并登录了。

PS。是的,用户的角色是 admin

PS。 "admin" 是正确的小写

PS。 ApplicationDbContext 继承IdentityDbContext

Ps2。这是我的数据

SELECT id,username FROM aspnetusers;

|id          | username        |
|c4f7bf16... | admin@admin.com |

SELECT Id,Name FROM aspnetroles;

|Id          | Name  |
|50e2a572... | admin |

SELECT * FROM aspnetuserroles;

|UserId      | RoleId     |
|c4f7bf16... | 50e2a572...|

身份服务器配置为 return 在 authentication.you 之后声明中的角色可以检查控制器中的声明。

像这样

var claims = User.Claims.ToList();

确保您的 ApplicationDbContext 继承了 IdentityDbContext

public class ApplicationDbContext: IdentityDbContext<ApplicationUser>

您的问题还有一个可能,请检查您的角色名称是否为admin

对于AuthorizeUser.IsInRole,它是区分大小写的,这意味着如果您的角色名称是Admin,它将在User.IsInRole("admin")或[=16]时失败=].

检查是否为 admin 的一种方法,请尝试 await _userManager.IsInRoleAsync(user, "user")

        var user = await _userManager.FindByNameAsync(User.Identity.Name);

        var r1 = User.IsInRole("User");
        var r2 = User.IsInRole("user");
        var r3 = await _userManager.IsInRoleAsync(user, "user");

您可以尝试将 role 定义为 const 以避免大小写不匹配。

我感觉这是因为你的 Roles 和你的 Claims 在某处混淆了。

根据 the docs,ClaimsPrincipal.IsInRole() 方法检查 ClaimsIdentity.RoleClaimType.

类型的声明

可以设置 "admin" 的 Claim 而不是 ClaimType ClaimsIdentity.RoleClaimType,在这种情况下它将无法通过身份验证。

经过很多错误,我终于找到了我遗漏的东西。

我只扩展了 UserClaimsPrincipalFactory<ApplicationUser>而不是 UserClaimsPrincipalFactory<ApplicationUser, IdentityRole>

正确扩展角色后可以claimend。

public class MyUserClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser, IdentityRole>