Benutzerdefiniertes AuthorizeAttribute mit benutzerdefinierter Authentifizierung

8

Ich verwende die ASP.NET MVC 4-Webanwendung als Front-End für einige WCF-Dienste. Die gesamte Benutzeranmeldung / -abmeldung und Sitzungssteuerung erfolgt auf dem Back-End. Die MVC-App sollte nur einen einzelnen Cookie mit Sitzungs-ID speichern. Mein Client erlaubt keine Formularauthentifizierung, alles muss angepasst werden.

Ich habe Folgendes in meiner web.config eingerichtet:

%Vor%

Ich habe auch einen globalen Filter:

%Vor%

welches in Global.asax

aufgerufen wird %Vor%

Ich habe mit [AllowAnonymous] alle Controller und Aktionen markiert, die keine Autorisierung benötigen.

Und jetzt muss ich MyAuthorizeAttribute implementieren. Ich habe einige Tutorials ausprobiert, aber keines von ihnen passt perfekt zu meinen Szenarien.

Grundsätzlich muss ich die folgenden Szenarien für jede Aktion behandeln:

  1. Wenn ein gültiger Cookie vorhanden ist, sollte die aktuelle Anfrage berücksichtigt werden autorisiert (es wird keine Rolle zu überprüfen geben, nur eine Art von Benutzern).
  2. Wenn es keinen Keks gibt, sollte ich überschreiben Sie den MVC-Standardhandler (der versucht, Account / Login zu laden) und umleiten Benutzer auf Home / Index Seite mit einer Nachricht, dass der Benutzer sollte sich einloggen.
  3. Wenn der WCF-Methodenaufruf ausgelöst wird FaultException, wo unsere benutzerdefinierte SecurityFault sagt Diese Sitzung ist abgelaufen (SecurityFault verfügt über ein benutzerdefiniertes enum-Feld was den Grund der Ausnahme enthält), ich sollte meine Gewohnheit zerstören Sitzungscookie und leite den Benutzer erneut auf Startseite / Indexseite um Nachricht, dass der Benutzer sich anmelden sollte, weil seine letzte Sitzung stattgefunden hat abgelaufen. Bei all den anderen SecurityFaults kann ich sie durchlassen - ich habe einen globalen Fehlerhandler.

Soweit ich es verstehe, muss ich AuthorizeCore überschreiben (um zu überprüfen, ob meine Sitzung existiert und noch gültig ist) und HandleUnauthorizedRequest (um Benutzer auf Home / Index umzuleiten anstelle der Standard-Login-Seite).

Für die Umleitung habe ich versucht:

%Vor%

scheint das zweite Szenario zu verarbeiten (ich bin mir nicht sicher, ob es sich um einen Basisanruf handelt - ist es nötig?).

Für das erste Szenario muss ich AuthorizeCore implementieren. Ich bin mir nicht sicher, wie ich es richtig machen soll. Ich habe gesehen, dass AuthorizeAttribute Code für die Behandlung von Caching-Situationen und möglicherweise viele weitere versteckte Funktionen hat und ich möchte es nicht brechen.

Für das dritte Szenario bin ich nicht sicher, ob MyAuthorizeAttribute damit umgehen kann. Kann AuthorizeAttribute Ausnahmen abfangen, die innerhalb der Aktion auftreten, oder muss ich SecurityFault.SessionExpired Situationen in meinem globalen Fehlerhandler behandeln?

    
JustAMartin 01.10.2012, 11:23
quelle

3 Antworten

5

Nicht ganz sicher, ob ich es erhalte, aber wenn Sie einen benutzerdefinierten Autorisierungsfilter erstellen, der das Attribut System.Web.MVC.Authorize wie folgt erbt.

%Vor%

Und dann dekorieren Sie Ihre Methoden, die diese Autorisierung verwenden müssen, die den Trick machen?

    
Jive Boogie 01.10.2012 21:49
quelle
3

In Bezug auf Ihre erste Anforderung:

Wie Sie bereits herausgefunden haben, kümmert sich OnAuthorization um eine Reihe von Aspekten, einschließlich z. Caching.
Wenn Sie nur an der Anpassung der Benutzeranmeldeinformationen interessiert sind, sollten Sie stattdessen AuthorizeCore überschreiben. Zum Beispiel:

%Vor%

Vielleicht möchten Sie auch einen Blick auf diese anderen Themen werfen:

  1. SO - benutzerdefiniertes Autorisierungsattribut
  2. ASP.NET - Benutzerdefinierte Autorisierungsfilter-Umleitungsprobleme
  3. Tagebuch eines Ninja
superjos 13.03.2013 20:14
quelle
2

So habe ich es jetzt gemacht:

%Vor%

Es geht jedoch nicht mit meinem 3. Szenario, also werde ich es in einem globalen Fehlerhandler implementieren.

    
JustAMartin 02.10.2012 08:59
quelle