Wie konfiguriere ich mein mvc / webapi-Projekt so, dass eine aus einer Rasiereransicht aufgerufene Webapi-Methode die Anmeldeseite nicht zurückgibt, wenn sie nicht autorisiert ist?
Es ist eine MVC5-Anwendung, die auch WebApi-Controller für Anrufe über Javascript enthält.
Die beiden folgenden Methoden
[Route("api/home/LatestProblems")]
[HttpGet()]
public List<vmLatestProblems> LatestProblems()
{
// Something here
}
[Route("api/home/myLatestProblems")]
[HttpGet()]
[Authorize(Roles = "Member")]
public List<vmLatestProblems> mylatestproblems()
{
// Something there
}
werden über den folgenden Winkelcode aufgerufen:
angular.module('appWorship').controller('latest',
['$scope', '$http', function ($scope,$http) {
var urlBase = baseurl + '/api/home/LatestProblems';
$http.get(urlBase).success(function (data) {
$scope.data = data;
}).error(function (data) {
console.log(data);
});
$http.get(baseurl + '/api/home/mylatestproblems')
.success(function (data) {
$scope.data2 = data;
}).error(function (data) {
console.log(data);
});
}]
);
Ich bin also nicht angemeldet und die erste Methode gibt erfolgreich Daten zurück. Die zweite Methode gibt (in der Erfolgsfunktion) Daten zurück, die das Äquivalent einer Anmeldeseite enthalten. dh was würden Sie in mvc erhalten, wenn Sie eine Controller-Aktion anfordern würden, die mit [Authorize] versehen ist und Sie nicht angemeldet sind.
Ich möchte, dass ein 401 nicht autorisiert zurückgegeben wird, damit ich verschiedene Daten für Benutzer anzeigen kann, je nachdem, ob sie angemeldet sind oder nicht. Wenn der Benutzer angemeldet ist, möchte ich idealerweise auf die Benutzereigenschaft des Controllers zugreifen können, damit ich Daten zurückgeben kann, die für dieses Mitglied spezifisch sind.
UPDATE: Da keiner der folgenden Vorschläge mehr zu funktionieren scheint (Änderungen an Identität oder WebAPI), habe ich ein Rohbeispiel für Github erstellt, das das Problem veranschaulichen soll.
Brock Allen hat einen schönen Blog-Beitrag darüber, wie man 401 für Ajax-Anrufe zurückgibt, wenn man die Cookie-Authentifizierung und OWIN verwendet. http://brockallen.com/2013/10/27/using-cookie-authentication-middleware-with-web-api-and-401-response-codes/
Fügen Sie dies in die ConfigureAuth-Methode in der Datei Startup.Auth.cs ein:
quelle
/api
können Sie den Pfad verwenden, um zu bestimmen, ob umgeleitet werden soll. Dies ist besonders nützlich, wenn Sie Clients haben, die andere Formate wie JSON verwenden. Ersetzen Sie den Anruf durchIsAjaxRequest
durchif (!context.Request.Path.StartsWithSegments(new PathString("/api")))
.private static bool IsAjaxRequest(IOwinRequest request) { return request.Query?["X-Requested-With"] == "XMLHttpRequest" || request.Headers?["X-Requested-With"] == "XMLHttpRequest"; }
Wenn Sie asp.net WebApi auf der asp.net MVC-Website hinzufügen, möchten Sie wahrscheinlich auf einige Anfragen nicht autorisiert antworten. Aber dann kommt die ASP.NET-Infrastruktur ins Spiel, und wenn Sie versuchen, den Antwortstatuscode auf HttpStatusCode.Unauthorized zu setzen, erhalten Sie eine Weiterleitung zur Anmeldeseite.
Wenn Sie die asp.net-Identität und die owin-basierte Authentifizierung verwenden, finden Sie hier einen Code, der zur Lösung dieses Problems beitragen kann:
quelle
Ich habe die gleiche Situation, wenn OWIN die 401-Antwort von WebApi immer auf die Anmeldeseite umleitet. Unsere Web-API unterstützt nicht nur Ajax-Aufrufe von Angular, sondern auch Mobile Win Win-Aufrufe. Daher ist die Lösung zur Überprüfung, ob die Anfrage eine Ajax-Anfrage ist, für unseren Fall nicht wirklich sortiert.
Ich habe mich für einen anderen Ansatz entschieden, bei dem eine neue Header-Antwort
Suppress-Redirect
eingefügt wird : Wenn die Antworten von webApi stammen. Die Implementierung erfolgt im Handler:Und registrieren Sie diesen Handler auf globaler Ebene von WebApi:
Beim Start von OWIN können Sie also überprüfen, ob der Antwortheader Folgendes enthält
Suppress-Redirect
:quelle
In früheren Versionen von ASP.NET mussten Sie eine ganze Reihe von Aufgaben ausführen , damit dies funktioniert.
Die gute Nachricht ist, dass Sie ASP.NET 4.5 verwenden. Sie können die Umleitung der Formularauthentifizierung mithilfe der neuen Eigenschaft HttpResponse.SuppressFormsAuthenticationRedirect deaktivieren .
In
Global.asax
:BEARBEITEN : Vielleicht möchten Sie auch einen Blick auf diesen Artikel von Sergey Zwezdin werfen, der eine verfeinerte Methode bietet, um das zu erreichen, was Sie versuchen.
Relevante Codefragmente und Autorenerzählungen werden unten eingefügt. Ursprünglicher Autor von Code und Erzählung - Sergey Zwezdin .
Lassen Sie uns zunächst feststellen, ob die aktuelle HTTP-Anforderung eine AJAX-Anforderung ist. Wenn ja, sollten wir das Ersetzen von HTTP 401 durch HTTP 302 deaktivieren:
Zweitens: Fügen wir eine Bedingung hinzu: Wenn der Benutzer authentifiziert ist, senden wir HTTP 403. und sonst HTTP 401.
Gut gemacht. Jetzt sollten wir alle Verwendungen von Standard AuthorizeAttribute durch diesen neuen Filter ersetzen. Es ist möglicherweise nicht anwendbar für Sime-Leute, die sich mit Code auskennen. Aber ich kenne keinen anderen Weg. Wenn ja, gehen wir bitte zu den Kommentaren.
Das Letzte, was wir tun sollten - um die HTTP 401/403-Behandlung auf einer Clientseite hinzuzufügen. Wir können ajaxError bei jQuery verwenden, um Codeduplizierungen zu vermeiden:
Das Ergebnis -
quelle
Wenn Sie Ihre
Web API
innerhalb IhresMVC
Projekts ausführen, müssen Sie eine benutzerdefinierteAuthorizeAttribute
Datei erstellen , die auf IhreAPI
Methoden angewendet werden soll. Innerhalb der müssenIsAuthorized
override
Sie den StromHttpContext
abrufen, um die Umleitung wie folgt zu verhindern:quelle
Bei Verwendung der Azure Active Directory-Integration selbst hat der Ansatz mit der
CookieAuthentication
Middleware bei mir nicht funktioniert. Ich musste folgendes tun:Wenn die Anforderung vom Browser selbst stammt (und beispielsweise nicht von einem AJAX-Aufruf), enthält der Accept-Header
html
irgendwo die Zeichenfolge . Nur wenn der Client HTML akzeptiert, halte ich eine Weiterleitung für nützlich.Meine Client-Anwendung kann mit dem 401 umgehen und den Benutzer darüber informieren, dass die App keinen Zugriff mehr hat und neu geladen werden muss, um sich erneut anzumelden.
quelle
Ich hatte auch eine MVC5-Anwendung (System.Web) mit WebApi (unter Verwendung von OWIN) und wollte nur verhindern, dass 401 Antworten von WebApi in 302 Antworten geändert werden.
Für mich hat es funktioniert, eine angepasste Version des WebApi AuthorizeAttribute wie folgt zu erstellen:
Und um es anstelle des Standard-WebApi AuthorizeAttribute zu verwenden. Ich habe das Standard-MVC AuthorizeAttribute verwendet, um das MVC-Verhalten unverändert zu lassen.
quelle
SuppressFormsAuthenticationRedirect
Flags hat dazu geführt, dass nur das vorhandene 401 für mich zurückgegeben wurde.Installieren Sie einfach das folgende NeGet-Paket
Installationspaket Microsoft.AspNet.WebApi.Owin
Schreiben Sie den folgenden Code in die WebApiConfig-Datei.
quelle
config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
andersUser.Identity.IsAuthenticated
false
Wenn Sie Content-Type == application / json abfangen möchten, können Sie diesen Code verwenden:
Grüße!!
quelle
Es fiel mir schwer, sowohl den Statuscode als auch eine Textantwort in den OnAuthorization / HandleUnauthorizedRequest-Methoden zum Laufen zu bringen. Dies stellte sich als die beste Lösung für mich heraus:
quelle
Nachdem ich viel Aufhebens gemacht hatte, um die Weiterleitungen zur Anmeldeseite zu vermeiden, wurde mir klar, dass dies für das Attribut "Autorisieren" durchaus angemessen ist. Es heißt, geh und hol die Genehmigung. Stattdessen wollte ich für Api-Anrufe, die nicht autorisiert sind, keine Informationen an Hacker weitergeben. Dieses Ziel war einfacher direkt zu erreichen, indem ein neues Attribut hinzugefügt wurde, das von Authorize abgeleitet wurde und stattdessen den Inhalt als 404-Fehler verbirgt:
quelle
Danke Leute!
In meinem Fall habe ich die Antworten von cuongle & Shiva kombiniert und so etwas erhalten:
Im OnException () - Handler des Controllers für API-Ausnahmen:
Im App-Startkonfigurationscode:
quelle
Wenn Sie MVC und WebAPI mischen und die Anforderung nicht autorisiert ist, wird sie auch in WebAPI-Anforderungen zur Anmeldeseite umgeleitet. Dazu können wir den folgenden Code hinzufügen, um eine Antwort an die mobile Anwendung zu senden
quelle
In MVC 5 mit Dot Net Framework 4.5.2 erhalten wir "application / json, klagetext .." unter "Accept" -Header. Es wird schön sein, wie folgt zu verwenden:
quelle