Wie wird die ASP.NET-Web-API 403 oder 401 entsprechend reagieren lassen?

8

Ich verwende ASP.NET Web API. Und ich mag die Fähigkeit, Attribute hinzuzufügen, um Ebenen des Zugriffs auf die API-Controller wie folgt zu spezifizieren:

%Vor%

So weit, so gut, aber wenn ich Rollen benutze, bricht das Konzept auseinander.

%Vor%

Mein Benutzer hat sich möglicherweise vor einer Weile am System angemeldet und dann treffen sie irgendwann eine Ressource, die ihnen "verboten" ist. Es hat keinen Sinn, wenn der Benutzer versucht, sich erneut anzumelden. Da ihr rechtmäßiger Account keinen Zugriff auf diese URL hat. Aber im Moment bekommen sie 401 (nicht autorisiert) anstelle von 403 (verboten), als hätten sie sich mit dem falschen Account eingeloggt. Aber der Benutzer hat nur einen Account und es ist nicht beabsichtigt, dass Nutzer nach einem Account fragen, der jemand anderem gehört.

Hat jemand anderes mit diesem Problem zu tun? Kann jemand das beheben? Ich bin mehr als willens, den Code zu schreiben, um das zu beheben, aber ich bin derzeit nicht weiter auf dem richtigen Weg.

    
Arturo Hernandez 31.03.2013, 20:50
quelle

3 Antworten

23

Beim Lesen des Parv-Vorschlags habe ich den folgenden benutzerdefinierten Filter namens [WebApiAuthorize] erstellt.

Der Schlüssel ist die HandleUnauthorizedRequest () -Methode. Wenn Code innerhalb dieser Methode ausgeführt wird, liegt es daran, dass der Benutzer aus irgendeinem Grund nicht autorisiert ist. Jetzt bestimmen wir einfach "warum" .... und dann entweder:

  1. Aufruf der Basismethode für das Standardverhalten (return 401) .... or ....
  2. Geben Sie unsere eigene Antwort mit einem 403 zurück.

Wie Sie sehen können, gibt es bei Bedarf 403 zurück (authentifiziert, aber nicht autorisiert).

%Vor%

Um zu verwenden, werfen Sie einfach den benutzerdefinierten Filter auf einen Controller oder eine Aktion wie folgt .....

%Vor%     
ClearCloud8 08.05.2015 19:19
quelle
1

Ich habe ein bisschen geforscht und eine Lösung für mich programmiert. Ich habe zwei verschiedene Autorize-Attribute in System.Web.Mvc und eine zweite in System.Web.Http gefunden. Der erste gilt für eine normale MVC4-App und der zweite für den WebAPI-Teil von MVC4, der für Web-Services einschließlich RESTful-Schnittstellen verwendet wird. Also habe ich den zweiten benutzt.

Ich entschied mich für die Autorisieren von Attributquellen Code bei Codeplex. Und ich habe das gefunden:

%Vor%

Es ist leicht zu sehen, wie Authentifizierung und Zugriff durch die Tatsache verschmolzen werden, dass beide den gleichen Effekt haben, falsch zurück zu geben.

Hier ist ein neues AuthorizeAttribute , das ich geschrieben habe, das 403 zurückgibt, wenn der Benutzer oder die Rollen nicht übereinstimmen. Auf diese Weise vermeiden Sie, ein natives Anmeldefenster zu erhalten. Es enthält den folgenden Code.

%Vor%     
Arturo Hernandez 02.04.2013 15:23
quelle
0

Was Sie tun können, ist eine benutzerdefinierte Authorize attribute zu erstellen und dann die AuthorizeCore und OnAuthorizationFailed in letzterer können Sie jede gewünschte Antwort senden

Sehen Sie sich einen an hier

    
Parv Sharma 31.03.2013 20:56
quelle