2013-02-14 17 views
25

Jak widzę mam 3 możliwych miejsc do wtyczki moje rzeczy w rurociąguGdzie powinienem dodać autoryzację w asp.net WebAPI?

1)  AuthorizationFilters 

2)  Action Filters 

3)  DelegatingHandler 

Najbardziej oczywiste jest AuthorizationFilters, gdzie mogę ozdobić moje czyny/controllers z mojego atrybutu niestandardowego autoryzacji. powiedz .. MyCustomAuthorizationAttribute.

Ponieważ moduły obsługi wiadomości HTTP znajdują się w pierwszym etapie procesu przetwarzania. Czy to ma jakiś sens, aby go tam umieścić?

Autoryzacja dla mnie oznacza po prostu sprawdzanie tokena w nagłówku, który jest przekazywany klientowi po uwierzytelnieniu.

Odpowiedz

37

Aktualizacja lipiec 2014

Moja odpowiedź oryginalny pokryte WebAPI 1. z WebAPI 2 nastąpiły pewne zmiany to znaczy nie ma obecnie IAuthenticationFilter czemu można przenieść logikę uwierzytelniania z DelegatingHandler który jest trochę bardziej eleganckie.

Istnieje projekt Nuget here, który oferuje implementację IAuthenticationFilter, a także wyjaśnia pewne tło do jej wprowadzenia.

OWIN middleware jest chyba najlepszym miejscem do realizacji logiki uwierzytelniania - jest przykładem uwierzytelniania certyfikatu here i Basic Authentication OWIN Middleware tutaj w this blog post były przykładem jest preferowana, ponieważ demonstruje użycie bazy AuthenticationHandler klasa.

Porada dotycząca AuthorizationFilters pozostaje w dużej mierze niezmieniona.

Koniec Aktualizacja

Zazwyczaj ...

Zastosowanie DelegatingHandler przeprowadzić uwierzytelnianie ... czyli kto ktoś jest. Użyj tego, aby ustawić zasadę wątku i kontekst użytkownika, dodać roszczenia itp. Możesz tutaj umieścić logikę autoryzacji, ale w skali dość globalnej. Osobiście zawsze użyłbym AuthorizationFilters do autoryzacji.

Użyj AuthorizationFilters, aby ograniczyć kontrolery i akcje do określonych osób. Są one używane, gdy można ekstrapolować ich uprawnienia z informacjami zawartymi w oświadczeniach, dyrektorze, adresie URL lub parametrach żądania HTTP. Domyślny filtr autoryzacji może być użyty do ograniczenia dostępu anonimowym użytkownikom lub rolom (jeśli jest ustawiony w programie obsługi delegowania) - oczywiście możesz również zaimplementować własne filtry autoryzacji, jeśli ich potrzebujesz.

Niekiedy należy użyć opcji ActionFilters, gdy trzeba podjąć decyzję o autoryzacji za pomocą treści wiadomości, np. potrzebujesz dostępu do nieruchomości w jednostce, aby zdecydować, czy mają dostęp (oczywiście ostrożnie z tym (!)).

Uwaga:

AuthorizationFilters nazywane są przed treścią ciała jest zatem przeczytać, że nie mają dostępu do treści wiadomości do podejmowania decyzji dotyczących autoryzacji to dlaczego ActionFilters konkretnie OnActionExecuting służy do uwierzytelniania podbicie okazjonalnego błędy.

Więc

W swoim scenariuszu chciałbym umieścić prosty DelegatingHandler wziąć swój nagłówek i ustawić zleceniodawcy.

public class CustomAuthenticationMessageHandler : DelegatingHandler 
{ 


    public CustomAuthenticationMessageHandler() 
    { 

    } 

    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, 
                  CancellationToken cancellationToken) 
    { 
     Authenticate(request); 

     return base.SendAsync(request, cancellationToken); 
    } 

    protected virtual void Authenticate(HttpRequestMessage request) 
    { 

     var authorisationHeader = request.Headers.Authorization; 

     if (authorisationHeader == null) 
     { 
      return; 
     } 

     //Ensure you are happy with the header contents then 

     { 
      var principal = new GenericPrincipal(//new Identity , //Roles); 
      Thread.CurrentPrincipal = principal; 
      HttpContext.Current.User = principal; 
     } 

    } 
} 

Następnie użyj AuthorizationFilters ograniczyć dostęp:

[Authorize] 
    public string Get() 
    { 

    } 

    [Authorize(Roles = "Admin")] 
    public string GetAdminOnly() 
    { 

    } 

o rejestrację globalną uwierzytelniania

config.MessageHandlers.Add(new CustomAuthenticationMessageHandler()); 

będzie to oznaczać, że w każdym żądaniu głównym będzie ustawiony albo zerowy lub ważna tożsamość. Nie obsługuje autoryzacji, tzn. Nie odmawia dostępu do żadnych kontrolerów ani działań.

Aby rozpocząć ochronę zasobów

Albo docelowe chroniony kontrolerów i działań z normą lub zwyczajem [Autoryzacja] atrybutów. Lub zarejestrować globalnie:

config.Filters.Add(new AuthorizeAttribute()); 

I tylko biała lista kontrolery i akcje chcesz niezabezpieczone za pomocą atrybutu [AllowAnonymous].

Jeśli chcesz tylko uwierzytelnianie na niektórych trasach

Następnie można zmodyfikować DelegatingHandler trochę ustawienie InnerHandler na trasie do właściwego kontrolera np

public CustomAuthenticationMessageHandler(HttpConfiguration configuration) 
{ 
     InnerHandler = new HttpRoutingDispatcher(configuration); 
} 

a następnie można określić ten program obsługi na trasach tak:

config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "myurl", 
      defaults: new {}, 
      constraints: new {}, 
      handler: new CustomAuthenticationHandler(config) 
      ); 
+0

Czy to znaczy, będę sprawdzania zezwolenia na żądanie na żądanie pipeline..upside bycia mogę wysunąć z rurociągu prędzej czy autoryzacja nie istnieje ... powinien to być skonfigurowany na podstawie trasy, zakładając, że mogę mieć jakieś trasy, które nie wymagają autoryzacji/uwierzytelnienia. –

+0

Dodałbym uwierzytelnienie do każdej trasy, rejestrując program obsługi komunikatów config.MessageHandlers. Dodaj (nowy CustomAuthenticationMessageHandler()); Autoryzacja jest łatwa do wdrożenia na wiele sposobów. Jedno z podejść, jeśli twoja strona jest bezpieczna, to zarejestrować filtr autoryzacji globalnie config.Filters.Add (new AuthorizeAttribute()); a następnie po prostu przypasuj atrybut [AllowAhnonymous] do kontrolerów lub akcji, która ma pozostać niezabezpieczona. –

+1

Jak to zrobić, aby działało z funkcją Self Hosting WebApi? –

Powiązane problemy