【发布时间】:2021-03-12 02:38:26
【问题描述】:
我使用 Asp.Net Core 3.1 自带的 IdentityServer4 来实现基于角色的授权。
在调试时,我看到声明 http://schemas.microsoft.com/ws/2008/06/identity/claims/role 在进入服务器 Web Api 调用时被正确设置为“管理员”。但,
Web Api 的[Authorize (Roles = "Administrator")] 总是无法返回 403 错误。请注意,简单的[Authorize] 可以正常工作。
我完成了https://github.com/dotnet/AspNetCore.Docs/issues/14944 中描述的调试步骤,但没有成功。感谢您是否可以帮助进行基于角色的授权工作。
代码sn-p:
AddOpenIdConnect(IdentityServerConstants.ProtocolTypes.OpenIdConnect, opt =>
{
opt.Authority = "http://localhost:44369";
opt.RequireHttpsMetadata = false;
opt.ClientId = "mvc";
opt.ClientSecret = "secret";
opt.ResponseType = "code";
opt.SaveTokens = true;
opt.GetClaimsFromUserInfoEndpoint = true;
opt.Scope.Add("roles");
opt.ClaimActions.MapUniqueJsonKey("roles", "role");
opt.TokenValidationParameters = new TokenValidationParameters
{
NameClaimType = JwtClaimTypes.Name,
RoleClaimType = JwtClaimTypes.Role,
};
}).
解码后的JWT如下:
{
"nbf": 1606797785,
"exp": 1606801385,
"iss": "https://localhost:44369",
"aud": "BaselineAPI",
"client_id": "Baseline",
"sub": "38ba2f2e-100d-eb11-ae75-00f48da696da",
"auth_time": 1606752334,
"idp": "local",
"role": "Administrator",
"scope": [
"openid",
"profile",
"BaselineAPI"
],
"amr": [
"pwd"
]
}
更新: 用基于策略的授权替换角色。
将此添加到 Startup.cs:
services.AddAuthorization(options => {
options.AddPolicy("IsAdmin", policy => { policy.RequireClaim(ClaimTypes.Role, "Administrator"); });
});
将此添加到您的 Api 方法中:
[Authorize(Policy = "IsAdmin")]
【问题讨论】:
-
您是否使用jwt.io 之类的工具检查了 JWT,以确保角色声明在 JWT 中并包含您期望的数据?
-
感谢您的指点。是的,它确实显示了角色声明。我已经在问题中发布了 JWT
标签: asp.net-core identityserver4 asp.net-core-3.1