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.
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:
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%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% 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
Tags und Links asp.net-web-api authentication rest http authorization