0

Я внедрил SSO в свой api (web-api 2), и он корректно проверяет токен. Но теперь я должен добавить атрибут авторизации на основе требований. В маркер доступа у меня есть:openid: создать атрибут авторизации на основе претензии

"MyClaim.Read.All": "true" 

И я хотел бы, чтобы добиться чего-то вроде:

[ClaimAuthorizationAttribute("MyClaim.Read.All")] 
public sealed class MerchantProfileController : ApiController 

Так что если маркер не содержит это утверждение, я хотел бы дать ошибку 401.

Как достичь этого, поэтому я могу использовать этот атрибут для любого контроллера, которого я хочу с любыми требованиями?

ответ

0

Так я создал атрибут авторизации:

[AttributeUsage(AttributeTargets.All)] 
    public sealed class ClaimAuthorizationAttribute : AuthorizeAttribute 
    { 
     /// <summary> 
     /// Gets or sets the claim to check in the web token 
     /// </summary> 
     public string Claim { get; set; } 

     /// <inheritdoc/> 
     protected override bool IsAuthorized(HttpActionContext actionContext) 
     { 
      if (actionContext == null) 
      { 
       throw new ArgumentNullException(nameof(actionContext)); 
      } 

      var decoder = new JwtSecurityTokenHandler(); 

      var token = (JwtSecurityToken)decoder.ReadToken(actionContext.Request.Headers.Authorization.Parameter); 

      return token.Claims.Any(c => c.Type.Equals(this.Claim) && c.Value.Equals("True", StringComparison.OrdinalIgnoreCase)); 
     } 
    } 

И здесь применяется к контроллеру:

[ClaimAuthorization(Claim = "MyClaim.Read.All")]