2017-08-03 3 views
0

Ich habe benutzerdefinierte AuthorizeAttribute erstellen, die JWT Bearer Token behandeln soll, aber die Frage ist - jetzt erhalte ich alle Antworten, einschließlich 200 und 401 innerhalb Ok-Status, wie ich es ändern sollte, um den richtigen http-Status zu erhalten Code? Hier ist, wie AuthorizeAttribute wie folgt aussehen:Handle AuthorizeAttribute Antwort

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; 
     } 
    } 

Dies ist, wie Controller wie folgt aussehen:

[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); 
    } 
+0

Was meinst du "behandeln es in der Steuerung"? Der Punkt ist, dass man es im Controller überhaupt nicht handhaben muss. – Crowcoder

+0

@Crowcoder, das Problem ist, dass ich Fehlermeldung im Ok-Status erhalte, stattdessen möchte ich den richtigen Serverstatus erhalten. –

+1

Sie können die Frage bearbeiten, um den Fehler zu erfassen, was passiert und was für Sie falsch läuft. – Crowcoder

Antwort

1

i, indem Sie einige Tutorials in der Vergangenheit ein ähnliches Attribut haben. Wenn berechtigt, bin ich Rückkehr nicht wahr, aber ich zurückkehren dies:

return base.IsAuthorized(actionContext); 

Vielleicht lohnt es sich, eine Prüfung, ob diese zurück Sie den richtigen Statuscode.

Verwandte Themen