7

Ho una API web asp.net 4.5 in esecuzione utilizzando owin. Ogni volta che una richiesta non autorizzata è fatto restituisce un 401 con la seguente risposta come previsto:Restituzione di messaggi descrittivi 401 da Owin WebApi2

{"Message":"Authorization has been denied for this request."} 

Vorrei aggiungere ulteriori dettagli a questa risposta (di token scaduto, ruolo valido, ecc ...) ed ha implementato un personalizzato [AuthorizeAttribute] basato su questo SO post.

public class MyAuthorizeAttribute : AuthorizeAttribute 
{ 
    protected override void HandleUnauthorizedRequest(HttpActionContext actionContext) 
    { 
     var response = actionContext.Request.CreateResponse<MyError> 
      (new MyError() { Description = "This is why you're unauthorized" }); 
     response.StatusCode = HttpStatusCode.Unauthorized; 
     actionContext.Response = response; 
    } 
} 

e poi utilizzato sulle mie controller come questo:

[MyAuthorizeAttribute(Roles = "Foo")] 
public class MyController : ApiController 
{ 
    ... 
} 

che restituisce un 401 con la seguente risposta come previsto:

{"Description": "This is why you're unauthorized"} 

Tuttavia, non vedo come determinare il motivo per cui la richiesta non è autorizzata da HttpActionContext passata a MyAuthorizeAttribute.HandleUnauthorizedRequest. Ad esempio, quando eseguo il debug a livello locale e faccio una richiesta con un token scaduto, viene visualizzato un SecurityTokenExpiredException che spiega IDX10223: Lifetime validation failed. The token is expired. ValidTo: '...' Current time: '...'. o con un pubblico non valido genera uno SecurityTokenInvalidAudienceException che spiega Message=IDX10214: Audience validation failed. Audiences: '...'. Did not match: validationParameters.ValidAudience: 'null' or validationParameters.ValidAudiences: '...'. Ho impostato diversi punti di interruzione nel mio Startup.cs eppure non sono riuscito a catturare una di queste eccezioni prima che vengano lanciate.

Come determinare il motivo specifico per cui una richiesta non è autorizzata utilizzando il middleware owin?

risposta

0

Non ho capito come identificare le scadenze né i segmenti di pubblico non validi e così via, ma ho finito per usare questo per restituire almeno 403 s in base ai ruoli.

È possibile personalizzare il messaggio ("È necessario disporre del ruolo X per accedere a questa azione ...") utilizzando l'esempio nella domanda precedente.

public class MyAuthorizeAttribute : AuthorizeAttribute 
{ 
    protected override void HandleUnauthorizedRequest(HttpActionContext actionContext) 
    { 
     base.HandleUnauthorizedRequest(actionContext); 

     if (actionContext.RequestContext.Principal != null && 
      actionContext.RequestContext.Principal.Identity.IsAuthenticated && 
      Roles != null) 
     { 
      if (!Roles.Split(',').Any(x => 
       actionContext.RequestContext.Principal.IsInRole(x.Trim()))) 
      { 
       actionContext.Response.StatusCode = HttpStatusCode.Forbidden; 
      } 
     } 
    } 
} 
+0

hey @Greg c'è ancora qualche possibilità di gestirlo utilizzando OWIN? –