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

时间:2017-11-10 09:03:13

标签: asp.net-web-api identityserver3

我有一个Identityserver4,它为客户提供访问令牌。

在我的API上,我想确保允许客户端访问特定范围,并且在我授予此用户API访问权限之前,用户属于特定角色。

要做到这一点,我使用的是Identityserver3.accesstokenvalidation包。

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

这阻止了没有访问令牌的用户访问我的API,也检查提供的范围是否为“MyScope”。

我的问题是如何在允许访问API之前检查用户是否具有特定角色。

1 个答案:

答案 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,它将始终返回未授权状态代码。