7

Mam ap ASPIX 4.5 web api działający przy użyciu owin. Ilekroć nieuprawniona jest wniosek zwraca 401 z następującej odpowiedzi zgodnie z oczekiwaniami:Powracające opisowe wiadomości 401 od Owin WebApi2

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

Chciałbym dodać dodatkowe szczegóły do ​​tej odpowiedzi (wygasł tokena, nieważne roli, etc ...) i wdrożony zwyczaj [AuthorizeAttribute] na podstawie tego 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; 
    } 
} 

a następnie użył go na moich kontrolerami tak:

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

która zwraca 401 z następującej odpowiedzi zgodnie z oczekiwaniami:

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

Ja jednak nie widzę w jaki sposób określić przyczynę żądania nieautoryzowanego z HttpActionContext przekazanego do MyAuthorizeAttribute.HandleUnauthorizedRequest. Na przykład, gdy debuguję lokalnie i wysyłam żądanie z wygasłym tokenem, generuje on komunikat SecurityTokenExpiredException wyjaśniający IDX10223: Lifetime validation failed. The token is expired. ValidTo: '...' Current time: '...'. lub z nieprawidłową publicznością, który wyrzuca SecurityTokenInvalidAudienceException wyjaśniając Message=IDX10214: Audience validation failed. Audiences: '...'. Did not match: validationParameters.ValidAudience: 'null' or validationParameters.ValidAudiences: '...'. Ustawiłem kilka punktów przerwania w moim Startup.cs, ale nie byłem w stanie nawet złapać jeden z tych wyjątków, zanim zostaną rzucone.

Jak określić konkretny powód, dla którego żądanie jest nieautoryzowane za pomocą oprogramowania pośredniczącego owin?

Odpowiedz

0

Nie wymyśliłem, jak rozpoznać daty wygaśnięcia, nieważne grupy odbiorców itp., Ale w końcu skorzystałem z tego, aby przynajmniej zwracać 403 s na podstawie ról.

Możesz dostosować wiadomość ("Musisz mieć rolę X, aby uzyskać dostęp do tej akcji ..."), korzystając z przykładu w powyższym pytaniu.

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

hej @Greg czy istnieje szansa na obsłużenie tego przy użyciu OWIN? –

Powiązane problemy