我有一个Identityserver4,它为客户提供访问令牌。
在我的API上,我想确保允许客户端访问特定范围,并且在我授予此用户API访问权限之前,用户属于特定角色。
要做到这一点,我使用的是Identityserver3.accesstokenvalidation包。
app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
{
Authority = "Authority",
RequiredScopes = new[] { "MyScope" },
});
这阻止了没有访问令牌的用户访问我的API,也检查提供的范围是否为“MyScope”。
我的问题是如何在允许访问API之前检查用户是否具有特定角色。
答案 0 :(得分:1)
您可以为特定控制器添加属性[Authorize(Roles = "Admin")]
。如果您需要更多具有声明的高级逻辑,则需要指定自己的属性,例如: AuthorizePermissionAttribute
并将其与控制器[AuthorizePermission("Preview")]
一起使用:
public class AuthorizePermissionAttribute : AuthorizeAttribute
{
private readonly string grantedPermission;
public AuthorizePermissionAttribute(string permission)
{
this.grantedPermission = permission ?? throw new ArgumentNullException(nameof(permission));
}
protected override bool IsAuthorized(HttpActionContext actionContext)
{
var claims = actionContext.ControllerContext.RequestContext.Principal as ClaimsPrincipal;
var permission = claims?.FindFirst(this.grantedPermission);
return permission != null && Convert.ToBoolean(permission.Value);
}
protected override void HandleUnauthorizedRequest(HttpActionContext actionContext)
{
var response = actionContext.Request.CreateErrorResponse(HttpStatusCode.Forbidden, "insufficient_permissions");
actionContext.Response = response;
}
}
你还需要输入Startup.cs:
JwtSecurityTokenHandler.InboundClaimTypeMap = new Dictionary<string, string>();
app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
{
Authority = ConfigurationManager.AppSettings["IdentityProviderApi"],
PreserveAccessToken = true
});
如果没有JwtSecurityTokenHandler.InboundClaimTypeMap
,它将始终返回未授权状态代码。