Tengo un sitio web MVC que usa autenticación OAuth / token para autenticar solicitudes. Todos los controladores relevantes tienen los atributos correctos y la autenticación funciona correctamente.
El problema es que no todas las solicitudes se pueden autorizar en el alcance de un atributo; algunas verificaciones de autorización deben realizarse en el código al que llaman los métodos del controlador; ¿cuál es la forma correcta de devolver una respuesta 401 no autorizada en este caso?
Lo he intentado throw new HttpException(401, "Unauthorized access");
, pero cuando hago esto, el código de estado de respuesta es 500 y también obtengo un seguimiento de la pila. Incluso en nuestro DelegatingHandler de registro podemos ver que la respuesta es 500, no 401.
fuente
HttpResponseException
versus cuándo devolver unUnauthorized()
. Usar la excepción para un error 'esperado' es un poco antipatrón, por lo que si hay casos en los que espera que la llamada cometa este error, regresarUnauthorized()
es probablemente la llamada correcta. AhorreHttpResponseException
para lo verdaderamente inesperado.Respuestas:
Debería lanzar un
HttpResponseException
desde su método API, noHttpException
:O, si desea proporcionar un mensaje personalizado:
fuente
Simplemente devuelva lo siguiente:
fuente
return Content<string>(HttpStatusCode.Unauthorized, "Message");
para hacer esto.Como alternativa a las otras respuestas, también puede usar este código si desea devolver un
IActionResult
dentro de un controlador ASP.NET.ASP.NET
Actualización: ASP.NET Core
El código anterior no funciona en ASP.NET Core, puede usar uno de estos en su lugar:
Aparentemente, la frase de motivo es bastante opcional ( ¿Puede una respuesta HTTP omitir la frase de motivo? )
fuente
ControllerBase
clase (utilizada por ASP.NET Core WebAPI) ya no tiene unaContent
sobrecarga que acepta un código de estado HTTP.HttpStatusCode.Unauthorized
), no 200.Content(...)
simplemente una forma abreviada de devolver cualquier contenido dado con un código de estado HTTP dado. Si desea enviar 200, puede usarOk(...)
Obtiene un código de respuesta 500 porque está lanzando una excepción (the
HttpException
) que indica algún tipo de error del servidor, este es el enfoque incorrecto.Simplemente configure el código de estado de respuesta .eg
fuente
Response
propiedad.Para agregar a una respuesta existente en ASP.NET Core> = 1.0, puede
Para pasar información al cliente, puede hacer una llamada como esta:
En el cliente, además de la respuesta 401, también tendrá los datos pasados. Por ejemplo, en la mayoría de los clientes puede
await response.json()
conseguirlo.fuente
En .Net Core puede usar
en vez de
que tiene la ventaja de redirigir a la página no autorizada predeterminada (Account / AccessDenied) en lugar de dar un 401 directo
para cambiar la ubicación predeterminada modifique su startup.cs
fuente
puede usar el código de seguimiento en asp.net core 2.0:
fuente
También sigues este código:
fuente