web-dev-qa-db-fra.com

API Web ASP.NET: méthode correcte pour renvoyer une réponse 401 / non autorisée

J'ai un site web MVC MVC qui utilise l'authentification par jeton OAuth/pour authentifier les demandes. Tous les contrôleurs pertinents ont les bons attributs et l'authentification fonctionne correctement.

Le problème est que toutes les demandes ne peuvent pas être autorisées dans le cadre d'un attribut - certaines vérifications d'autorisation doivent être effectuées dans un code appelé par les méthodes du contrôleur - quelle est la bonne façon de renvoyer une réponse 401 non autorisée dans ce cas?

J'ai essayé throw new HttpException(401, "Unauthorized access");, mais lorsque je le fais, le code d'état de la réponse est 500 et je reçois également une trace de pile. Même dans notre journalisation, DelegatingHandler, nous pouvons voir que la réponse est 500, pas 401.

78
GoatInTheMachine

Vous devriez lancer un HttpResponseException à partir de votre méthode API, et non pas HttpException :

throw new HttpResponseException(HttpStatusCode.Unauthorized);

Ou, si vous souhaitez fournir un message personnalisé:

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

Il suffit de retourner ce qui suit:

return Unauthorized();
75
JohnWrensby

En guise d'alternative aux autres réponses, vous pouvez également utiliser ce code si vous souhaitez renvoyer un IActionResult dans un contrôleur ASP.NET.

ASP.NET

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

Mise à jour: ASP.NET Core

Le code ci-dessus ne fonctionne pas dans ASP.NET Core, vous pouvez utiliser l'un de ceux-ci à la place:

 return StatusCode((int)System.Net.HttpStatusCode.Unauthorized, "My error message");
 return StatusCode(401, "My error message");

Apparemment, la phrase de cause est plutôt optionnelle ( ne réponse HTTP peut-elle omettre la phrase de motif? )

14
Alex AIT

Vous obtenez un code de réponse 500 parce que vous générez une exception (le HttpException) qui indique une sorte d'erreur de serveur. C'est une mauvaise approche.

Il suffit de définir le code d’état de la réponse.

Response.StatusCode = (int)HttpStatusCode.Unauthorized;
7
DGibbs

vous pouvez utiliser le code de suivi dans asp.net core 2.0:

public IActionResult index()
{
     return new ContentResult() { Content = "My error message", StatusCode = (int)HttpStatusCode.Unauthorized };
}
0
A.R.F