Wie das abfangen 401 von Forms-Authentifizierung in ASP.NET MVC?
Ich möchte erzeugen eine 401-Seite, wenn der Benutzer nicht über die richtigen Berechtigungen.
Fordert der Benutzer eine url ein und gelangt auf die login-Seite (ich habe alle verweigern anonyme im web.config). Der Benutzer meldet sich erfolgreich an und auf dem ursprünglichen url umgeleitet. Jedoch, nach überprüfung der Berechtigung, es ist bestimmt, dass der Benutzer nicht über die erforderliche Berechtigung, also ich würde gerne erzeugen ein 401. Aber die Forms-Authentifizierung immer behandelt 401 und leitet den Benutzer auf die login-Seite.
Mir, das ist nicht richtig. Der Benutzer hat bereits authentifiziert, die user einfach nicht die richtigen Genehmigung.
In anderen Szenarien, wie in ajax oder REST-service-Szenario, ich definitiv nicht wollen, dass die login-Seite - ich brauche die richtige Seite 401.
So weit, ich habe versucht benutzerdefinierte Autorisieren filter zurück ViewResult mit 401 aber hat nicht funktioniert. Ich habe dann versucht eine normale Aktion Filter, überschreiben OnActionExecuting, das hat nicht funktioniert entweder.
Was ich war in der Lage zu tun ist, ein Ereignis zu behandeln, die in global.asax, PostRequestHandlerExecute, und die Kontrollkästchen für die Berechtigung schreiben Sie dann direkt zu einer Antwort:
if (permissionDenied)
{
Context.Response.StatusCode = 401;
Context.Response.Clear();
Context.Response.Write("Permission Denied");
Context.Response.Flush();
Context.Response.Close();
return;
}
Dass funktioniert, aber es ist nicht wirklich das was ich will.
Zunächst, ich bin mir auch nicht sicher, ob das die richtige Veranstaltung oder den Ort in der pipeline, das zu tun.
Zweitens möchte ich die 401-Seite, um ein wenig mehr Inhalt. Vorzugsweise sollte es sein, eine aspx-Seite, eventuell mit der gleichen master-Seite als der rest der Seite. So, wer sich die Website ansieht kann sehen, dass die Erlaubnis verweigert wird, aber mit dem gleichen look and feel, etc. aber die ajax-oder service-Benutzer den richtigen status-code zu handeln.
Jede Idee, wie dies erreicht werden kann?
Ich habe gesehen, andere Beiträge mit ähnlichen Anforderungen aber nicht sehen, eine Lösung, die ich verwenden kann.
Und Nein, ich glaube nicht, dass ein 403.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fand ich eine brauchbare Lösung.
401 redirect von FormsAuthenticationModule tritt während EndRequest. Da bei event-processing-Module aufgerufen werden, bevor global.asax, wir können override-status-code nach FormsAuthenticationModule hatte seine schmutzigen Hände auf die Anfrage.
In meine custom AuthorizationFilter, ich HttpContext.Posten["PermissionDenied"] zu wahren und dann in meine global.asax EndRequest, ich flip status-code von 200 bis 401. Dann Habe Ich Server.Transfer zu meiner benutzerdefinierten PermissionDenied anzeigen.
Ich würde trotzdem lieber FormsAuthenticationModule selbst wurde aktualisiert, um dieses Szenario zu behandeln, aber ich denke, das ist nicht zu hackish, dass ich denke, ich kann mit Ihr Leben.
Offensichtlich, Sie können ändern, wie Sie das signal, dass global.asax sollte spiegeln den status-code. Ich habe gerade versucht die Einstellung der status-code, um so etwas wie 511 und verwendet, dass die Bedingung, die eher als HttpContext.Elemente und das funktionierte auch. Ich denke mal, so lange die richtigen status-code geht aus der Tür, die ASP.NET Motor egal.
Stimme ich dem Standard-Verhalten ist falsch, vor allem unter Berücksichtigung von Ajax-Anfragen. Ich hoffe, um zu sehen, irgendeine Art von Lösung in MVCv3 (Daumen).
Ich weiß nur einen Weg, dies zu erreichen, entfernen Sie die Authentifizierungs-Abschnitt der web.config, das ist, was ASP.NET sieht für die Umleitung nicht autorisierte Anfragen. Sie können nicht deaktivieren Sie dieses "feature" meines Wissens. Wenn Sie eine Authentifizierungs-Abschnitt werden Sie weitergeleitet auf die login-url, wenn ASP.NET immer auf ein
401
status-code.Aber durch das entfernen dieses haben Sie einige andere Probleme. Wenn Sie jemals wollen, dass die Benutzer umgeleitet werden auf die login-Seite für die nicht-ajax-requests, werden Sie brauchen, um Ihre eigenen
AuthorizeAttribute
und verwenden Sie benutzerdefinierte Einstellungen, um zu bestimmen, wo die Umleitung zu. Auch alles andere in der Authentifizierung Abschnitt würde wahrscheinlich zu re-implementiert durch Sie als gut. Keine sehr praktische Lösung, komplizierte Websites.Habe ich noch nicht dies selbst getan, ich habe mich entschieden für eine Rückkehr
403
statt. Es ist ärgerlich, nicht die richtige HttpCode zurückgegeben, aber es ist besser als jede andere Lösung, die ich bisher gefunden habe.Vielleicht möchten Sie sich hier: ASP.NET MVC Benutzerdefinierte Fehlerbehandlung Application_Error Global.asax?
Sollten Sie in der Lage sein zu fangen die 401 und die route zu einer benutzerdefinierten Aktion an diesem Punkt. Wir tun dies für 404 und andere Ausnahmen im code, und es funktioniert ganz gut.