Attribut für die .net MVC-Controller-Aktionsmethode

8

Im Wesentlichen möchte ich eine freundliche Nachricht anzeigen, wenn jemand nicht Teil einer Rolle ist, die in meinem Attribut aufgeführt ist. Momentan spuckt meine Anwendung den Benutzer nur auf den Anmeldebildschirm zurück. Ich habe ein paar Posts gelesen, in denen es darum geht, ein benutzerdefiniertes Attribut zu erstellen, das [AuthorizeAttribute] erweitert, aber ich denke, da muss etwas aus der Box sein, um das zu tun?

Kann mir jemand bitte in die richtige Richtung zeigen, wo ich suchen muss, um den Benutzer nicht zum Anmeldeformular zu schicken, sondern einfach eine "nicht autorisierte" Nachricht zu machen?

    
Kyle 07.01.2010, 18:25
quelle

5 Antworten

2

Wenn Einfachheit oder totale Kontrolle der Logik gewünscht ist, können Sie dies in Ihrer Aktionsmethode aufrufen:

%Vor%

Es gibt einen bool zurück und Sie können den Rest Ihrer Logik abhängig von diesem Ergebnis machen.

Eine andere, die ich in einigen Fällen verwendet habe, ist:

%Vor%

Ich denke, dass eine Zeichenfolge [] zurückgibt, aber zitieren Sie mich nicht dazu.

BEARBEITEN: Ein Beispiel hilft immer ...

%Vor%

Solange der Rückgabetyp "ActionResult" ist, können Sie alle akzeptierten Rückgabetypen (ViewResult, PartialViewResult, RedirectResult, JsonResult ...) zurückgeben.

    
DM. 07.01.2010, 18:50
quelle
6

Ich könnte etwas zu spät kommen, um meine $ 0,02 hinzuzufügen, aber wenn Sie Ihren CustomAuthorizationAttribue erstellen, können Sie die AuthorizationContext.Result-Eigenschaft , um festzulegen, wohin die AuthorizeAttribute.HandleUnauthorizedRequest-Methode den Benutzer leitet.

Hier ist ein sehr einfaches Beispiel, mit dem Sie die URL angeben können, an die ein Benutzer nach einer fehlgeschlagenen Autorisierung gesendet werden soll:

%Vor%

Und wenn ich den Benutzer zu / Error / Unauthorized umleiten wollte, wie in einem früheren Post vorgeschlagen:

%Vor%     
crazyarabian 30.08.2010 20:26
quelle
3

Ich bin vor ein paar Tagen auf dieses Problem gestoßen und die Lösung ist ein bisschen detailliert, aber hier sind die wichtigen Teile. In AuthorizeAttribute gibt die Methode OnAuthorization eine HttpUnauthorizedResult zurück, wenn die Autorisierung fehlschlägt, was die Rückgabe eines benutzerdefinierten Ergebnisses etwas schwierig macht.

Am Ende habe ich eine CustomAuthorizeAttribute-Klasse erstellt und die OnAuthorization-Methode überschrieben, um stattdessen eine Ausnahme auszulösen. Ich kann dann diese Ausnahme mit einer benutzerdefinierten Fehlerbehandlungsroutine abfangen und eine angepasste Fehlerseite anzeigen, anstatt eine 401 (nicht autorisiert) zurückzugeben.

%Vor%

Dann können Sie in Ihrer web.config benutzerdefinierte Handler für bestimmte Fehler setzen:

%Vor%

und implementieren Sie dann Ihren eigenen ErrorController, um benutzerdefinierte Seiten bereitzustellen.

Auf IIS7 müssen Sie in die Einstellung Response.TrySkipIisCustomErrors = true; schauen, um Ihre benutzerdefinierten Fehler zu aktivieren.

    
Todd Smith 07.01.2010 21:10
quelle
2

Sehr ähnlich wie crazyarabian, aber ich leite nur zu meiner Zeichenfolge um, wenn der Benutzer tatsächlich authentifiziert ist. Dadurch kann das Attribut auf die Standardanmeldeseite umgeleitet werden, wenn sie derzeit nicht angemeldet sind, aber auf eine andere Seite, wenn sie keine Berechtigungen für den Zugriff auf die URL haben.

%Vor%     
Nick Randell 13.05.2011 17:20
quelle
0

Das out-of-the-box-Verhalten besteht darin, dass das [Authorize] -Attribut ein HTTP 401 zurückgibt. Das FormsAuthenticationModule (das standardmäßig geladen wird) fängt dieses 401 ab und leitet den Benutzer auf die Anmeldeseite um. Sehen Sie sich System.Web.Security.FormsAuthenticationModule :: OnLeave in Reflector an, um zu sehen, was ich meine.

Wenn Sie möchten, dass das AutorizeAttribute etwas anderes tut, als HTTP 401 zurückgibt, müssen Sie die AuthorizeAttribute :: HandleUnauthorizedRequest-Methode überschreiben und Ihre benutzerdefinierte Logik dort implementieren. Alternativ ändern Sie einfach diesen Teil von ~ \ Web.config:

%Vor%

Und zeigen Sie auf eine andere URL wie ~ / AccessDenied.

    
Levi 07.01.2010 19:35
quelle