2014-04-16 21 views
5

Prowadzę wiele badań na temat najlepszego sposobu zabezpieczenia mojej aplikacji MVC 5.Uwierzytelnianie MVC5: atrybut autoryzacji dla każdego kontrolera lub kontrolera podstawowego

Mamy jeden Web.csproj z wieloma kontrolerami WebAPI, a także witryną MVC z dwoma obszarami - jeden dla administratora, a następnie dla strony publicznej.

Po przeczytaniu this article which states that the Base Controller is best way postanowiłem zastosować to podejście.

Jednak osobiście nie jestem w porządku z użyciem kontrolerów bazowych (see this stackoverflow answer dla niektórych z moich argumentów).

Więc, biorąc pod uwagę, że używam MVC 5 (Identyfikacja ASP.Net i OWIN Authentication) - czy ktoś może rzucić nieco światła na plusy i minusy każdego podejścia?

+0

czy ten artykuł nie pokazuje, jak korzystać z filtrów globalnych? Uważam, że sterowniki bazowe były zalecane dla MVC 1 i 2 ... – dima

+0

@dima Tak, masz rację ... Pomyliłem się z następującym cytatem na dole artykułu: "Pozwól, że będę całkowicie jasny na ten temat Jedynym obsługiwanym sposobem zabezpieczenia aplikacji MVC jest posiadanie klasy bazowej z atrybutem [Authorize], a następnie posiadanie każdej podklasy typu kontrolera, która jest podstawowym typem. W inny sposób otworzy się luka w zabezpieczeniach. " Jednak myślę, że powiedziano w kontekście próby zabezpieczenia aplikacji MVC przez ograniczenia trasy ... poważne "nie-nie". – JTech

+0

ma rację, tylko ma na myśli globalne filtry ... Nie rozumiem, dlaczego nie skorzystasz z globalnych filtrów i nie sprawisz, że cała witryna będzie bezpieczna i zezwoli na anonimowy dostęp dla pewnych Akcje takie jak logowanie, rejestracja itp. – dima

Odpowiedz

19

Obecna praktyka w MVC 5 jest zastosowanie AuthorizeAttribute jako globalny filtr i otworzyć poszczególnych działań/controllers z AllowAnonymousAttribute

Więc App_Start \ FilterConfig.cs dodać następujące wiersze:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     ... existing filters 

     // use the [AllowAnonymous] attribute to open up individual Actions/Controllers 
     filters.Add(new System.Web.Mvc.AuthorizeAttribute()); 
     filters.Add(new RequireHttpsAttribute()); 
    } 

uwaga: na dokładkę mam również włączających RequireHttpsAttribute jak każdy uwierzytelniony wniosek z ASP.NET Identity niesie cookie uwierzytelniania, który jest podatny na Man In the Middle atakuje, jeśli jest przenoszony przez zwykły HTTP.

0

ja zawsze używać kontrolera zasady, na więcej powodów niż tylko uwierzytelniania i autoryzacji ...

Aby dostać się do pytania, co skończyło się robi toczył własną niestandardową Autoryzacja atrybutów złożonych reguł, które wszystko dziedzicz z AuthorizeAttribute. Jest to dość proste, wszystko co robisz, dziedziczy po danym atrybucie, a następnie nadpisuje metody OnAuthorization i AuthorizeCore.

Ogólnie, wszystkie nasze kontrolery nie pozwalają na dostęp anon, w oparciu o naszą klasę baseController. Stamtąd staje się tak skomplikowane, jak potrzeba. Ale zawsze warto używać klasy bazowej do takich rzeczy i na tej podstawie budować. Jeśli kiedykolwiek będziesz musiał szybko zmienić bardzo szeroki system, stuknij go w baseClass i to wszystko.

Powiązane problemy