J'ai un site Webapi MVC qui utilise l'authentification OAuth / jeton pour authentifier les demandes. Tous les contrôleurs concernés ont les bons attributs et l'authentification fonctionne correctement.
Le problème est que toute la demande ne peut pas être autorisée dans la portée 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 quand je fais cela, le code d'état de réponse est 500 et j'obtiens également une trace de pile. Même dans notre journalisation DelegatingHandler, nous pouvons voir que la réponse est 500, pas 401.
la source
HttpResponseException
par rapport au moment de renvoyer unUnauthorized()
. Utiliser l'exception pour une erreur «attendue» est un peu un anti-modèle, donc s'il y a des cas où vous vous attendez à ce que l'appel fasse cette erreur, le retourUnauthorized()
est probablement le bon appel. ÉconomisezHttpResponseException
pour le vraiment inattendu.Réponses:
Vous devriez lancer un à
HttpResponseException
partir de votre méthode API, pasHttpException
:Ou, si vous souhaitez fournir un message personnalisé:
la source
Renvoyez simplement ce qui suit:
la source
return Content<string>(HttpStatusCode.Unauthorized, "Message");
pour le faire.Comme 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
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:
Apparemment, la phrase de raison est assez facultative ( une réponse HTTP peut-elle omettre la phrase de raison? )
la source
ControllerBase
classe (utilisée par ASP.NET Core WebAPI) n'a plus deContent
surcharge qui accepte un code d'état HTTP.HttpStatusCode.Unauthorized
), pas 200.Content(...)
simplement un raccourci pour renvoyer un contenu donné avec un code d'état HTTP donné. Si vous voulez envoyer 200, vous pouvez utiliserOk(...)
Vous obtenez un code de réponse 500 parce que vous lancez une exception (le
HttpException
) qui indique une sorte d'erreur de serveur, c'est la mauvaise approche.Définissez simplement le code d'état de la réponse .eg
la source
Response
propriété.Pour ajouter à une réponse existante dans ASP.NET Core> = 1.0, vous pouvez
Pour transmettre des informations au client, vous pouvez faire un appel comme ceci:
Sur le client, en plus de la réponse 401, vous aurez également les données transmises. Par exemple, sur la plupart des clients, vous pouvez l'
await response.json()
obtenir.la source
Dans .Net Core, vous pouvez utiliser
au lieu de
qui a l'avantage de rediriger vers la page non autorisée par défaut (Account / AccessDenied) plutôt que de donner un simple 401
pour changer l'emplacement par défaut, modifiez votre startup.cs
la source
vous pouvez utiliser le code suivant dans asp.net core 2.0:
la source
Vous suivez également ce code:
la source