Обработка ответа AuthorizeAttribute

Я создал кастом AuthorizeAttribute это должно обрабатывать токен Jwt Bearer, но вопрос в том, что теперь я получаю все ответы, включая 200 и 401 в статусе Ok, как я должен изменить его, чтобы получить правильный код статуса http? Вот как AuthorizeAttribute выглядит как:

public class JwtAuthorizeAttribute : AuthorizeAttribute
    {
        private readonly string role;

        public JwtAuthorizeAttribute()
        {
        }

        public JwtAuthorizeAttribute(string role)
        {
            this.role = role;
        }

        protected override bool IsAuthorized(HttpActionContext actionContext)
        {
            var jwtToken = new JwtToken();
        string json = String.Empty;
        var ctx = actionContext.Request.GetRequestContext();
        if (ctx.Principal.Identity.IsAuthenticated) return true;
        if (actionContext.Request.Headers.Contains("Authorization"))
        {
            try
            {
                IJsonSerializer serializer = new JsonNetSerializer();
                IDateTimeProvider provider = new UtcDateTimeProvider();
                IJwtValidator validator = new JwtValidator(serializer, provider);
                IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
                IJwtDecoder decoder = new JwtDecoder(serializer, validator, urlEncoder);
                json = decoder.Decode(actionContext.Request.Headers.Authorization.Parameter, SiteGlobal.Secret, verify: true);
                jwtToken = JsonConvert.DeserializeObject<JwtToken>(json);
                if (jwtToken.aud != SiteGlobal.Audience || jwtToken.iss != SiteGlobal.Issuer || role != jwtToken.role)
                {
                    return false;
                }
            }
            catch (TokenExpiredException)
            {
                return false;
            }
            catch (SignatureVerificationException)
            {
                return false;
            }
        }
        else
        {
            return false;
        }
        var identity = new ClaimsIdentity("JWT");
        identity.AddClaim(new Claim(ClaimTypes.Name, jwtToken.unique_name));
        identity.AddClaim(new Claim(ClaimTypes.Role, jwtToken.role));
        identity.AddClaim(new Claim("user_id", jwtToken.user_id.ToString()));
        actionContext.Request.GetRequestContext().Principal = new ClaimsPrincipal(identity);
        return true;
        }
    }

Вот так выглядит контроллер:

[JwtAuthorize("Admin")]
[HttpGet]
[ResponseType(typeof(CatalogueListDto))]
public async Task<IHttpActionResult> Get()
  {
    var result = await _catalogueService.GetCatalogues();
    if (result == null) return BadRequest(ActionAnswer.Failed.CatalogueNotFound);
     return Ok(result);
  }

1 ответ

Решение

У меня есть похожий атрибут, следуя некоторым учебникам в прошлом. Если разрешено, я не возвращаю истину, но я возвращаю это:

return base.IsAuthorized(actionContext);

Возможно, стоит проверить, вернет ли это вам правильный код статуса.

Другие вопросы по тегам