如何允许特定角色使用 identityserver3.accesstokenvalidation 访问 API

How to allow specific roles to access API using identityserver3.accesstokenvalidation

我有一个为客户端提供访问令牌的 Identityserver4。

在我的 API 上,我想确保允许客户端访问特定范围并且该用户属于特定角色,然后再授予此用户访问 API.

为此,我正在使用 Identityserver3.accesstokenvalidation 包。

 app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
        {
            Authority = "Authority",
            RequiredScopes = new[] { "MyScope" },
        });

这会阻止没有访问令牌的用户访问我的 API,它还会检查提供的范围是否为 "MyScope"。

我的问题是如何在允许访问 API.

之前检查用户是否具有特定角色

您可以为特定控制器放置属性 [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它将return总是未授权状态代码。