Ich habe eine MVC-Webapi-Site, die die OAuth / Token-Authentifizierung zur Authentifizierung von Anforderungen verwendet. Alle relevanten Controller haben die richtigen Attribute und die Authentifizierung funktioniert einwandfrei.
Das Problem ist, dass nicht die gesamte Anforderung im Rahmen eines Attributs autorisiert werden kann - einige Autorisierungsprüfungen müssen in Code durchgeführt werden, der von Controller-Methoden aufgerufen wird - wie kann in diesem Fall eine nicht autorisierte 401-Antwort korrekt zurückgegeben werden?
Ich habe es versucht throw new HttpException(401, "Unauthorized access");
, aber wenn ich das mache, ist der Antwortstatuscode 500 und ich bekomme auch einen Stack-Trace. Selbst in unserem Protokollierungs-DelegatingHandler können wir sehen, dass die Antwort 500 und nicht 401 ist.
quelle
HttpResponseException
Versus zu werfen, wann er einen zurückgeben sollUnauthorized()
. Die Verwendung der Ausnahme für einen 'erwarteten' Fehler ist ein Anti-Muster. Wenn Sie also in einigen Fällen erwarten, dass der Anruf diesen Fehler macht,Unauthorized()
ist die Rückgabe wahrscheinlich der richtige Anruf. Speichern SieHttpResponseException
für das wirklich Unerwartete.Antworten:
Sie sollten eine
HttpResponseException
aus Ihrer API-Methode werfen , nichtHttpException
:Oder wenn Sie eine benutzerdefinierte Nachricht bereitstellen möchten:
quelle
Geben Sie einfach Folgendes zurück:
quelle
return Content<string>(HttpStatusCode.Unauthorized, "Message");
, um dies zu tun.Alternativ zu den anderen Antworten können Sie diesen Code auch verwenden, wenn Sie einen
IActionResult
innerhalb eines ASP.NET-Controllers zurückgeben möchten .ASP.NET
Update: ASP.NET Core
Der obige Code funktioniert in ASP.NET Core nicht. Sie können stattdessen einen der folgenden Codes verwenden:
Anscheinend ist die Grundphrase ziemlich optional ( Kann eine HTTP-Antwort die Grundphrase weglassen? )
quelle
ControllerBase
Klasse (von ASP.NET Core WebAPI verwendet) weist keineContent
Überladung mehr auf, die einen HTTP-Statuscode akzeptiert.HttpStatusCode.Unauthorized
), nicht 200.Content(...)
lediglich eine Abkürzung für die Rückgabe eines bestimmten Inhalts mit einem bestimmten HTTP-Statuscode. Wenn Sie 200 senden möchten, können Sie verwendenOk(...)
Sie erhalten einen 500-Antwortcode, weil Sie eine Ausnahme (die
HttpException
) auslösen, die auf einen Serverfehler hinweist. Dies ist der falsche Ansatz.Stellen Sie einfach den Antwortstatuscode .eg ein
quelle
Response
Eigenschaft verfügbar .Sie können eine vorhandene Antwort in ASP.NET Core> = 1.0 ergänzen
Um Informationen an den Kunden weiterzuleiten, können Sie einen Anruf wie folgt tätigen:
Auf dem Client haben Sie neben der 401-Antwort auch die übergebenen Daten. Zum Beispiel auf den meisten Kunden können Sie
await response.json()
es bekommen.quelle
In .Net Core können Sie verwenden
anstatt
Dies hat den Vorteil, dass auf die nicht autorisierte Standardseite (Account / AccessDenied) umgeleitet wird, anstatt eine gerade 401 zu geben
Um den Standardspeicherort zu ändern, ändern Sie Ihre startup.cs
quelle
Sie können den folgenden Code in asp.net core 2.0 verwenden:
quelle
Sie folgen auch diesem Code:
quelle