2015-07-03 4 views
44

Ich habe eine MVC Webapi-Site, die OAuth/Token-Authentifizierung verwendet, um Anforderungen zu authentifizieren. Alle relevanten Controller haben die richtigen Attribute und die Authentifizierung funktioniert einwandfrei.ASP.NET Web API: Korrekte Möglichkeit, eine 401/nicht autorisierte Antwort zurückzugeben

Das Problem ist, dass nicht alle der Anfrage im Rahmen eines Attributs autorisiert werden können - einige Berechtigungsprüfungen müssen in Code durchgeführt werden, der von Controller-Methoden aufgerufen wird - Was ist die richtige Methode, um eine 401 nicht autorisierte Antwort zurückzugeben in diesem Fall?

Ich habe versucht, , aber wenn ich dies tun, ist der Antwortstatuscode 500 und ich bekomme auch einen Stack-Trace. Sogar in unserem Logging DelegierenHandler können wir sehen, dass die Antwort 500, nicht 401 ist.

Antwort

70

Sie sollen ein HttpResponseException von Ihrer API-Methode werfen, nicht HttpException:

throw new HttpResponseException(HttpStatusCode.Unauthorized); 

Oder, wenn Sie eine benutzerdefinierte Nachricht liefern :

var msg = new HttpResponseMessage(HttpStatusCode.Unauthorized) { ReasonPhrase = "Oops!!!" }; 
throw new HttpResponseException(msg); 
+0

Ich habe gerade funktioniert, genau das zu tun, danke! – GoatInTheMachine

4

Sie erhalten einen 500 Antwort-Code, weil Sie eine Ausnahme werfen (die HttpException), die eine Art von Server-Fehler angibt, das ist falsch Ansatz.

Stellen Sie einfach den Antwortstatuscode .eg

Response.StatusCode = (int)HttpStatusCode.Unauthorized; 
+0

Es ist ein wenig seltsam, dann, dass die Ausnahme nimmt der HTTP-Statuscode als Parameter und Intellisense-Dokumente sagen, dass dies der Statuscode ist, der an den Client gesendet wurde - ich hatte gehofft, die Antwort nicht direkt zu mutieren, da dies fehleranfällig erscheint, da der globale Status – GoatInTheMachine

+1

Der Basis-Web-API-Controller ist stellt kein 'R dar esponse' Eigentum. – LukeH

46

Geben Sie einfach Folgendes zurück:

return Unauthorized(); 
+0

Ich denke, das akzeptierte beantwortet die Frage des OP spezifisch. Meine Antwort beantwortet den Fragetitel "ASP.NET Web API: Korrekter Weg zur Rückgabe einer 401/nicht autorisierten Antwort" – JohnWrensby

2

Als Alternative zu den anderen Antworten, können Sie diese auch verwenden:

return Content(HttpStatusCode.Unauthorized, "My error message"); 

Anscheinend ist der Grund Phrase ziemlich optional (Can an HTTP response omit the Reason-Phrase?)