Tengo un sitio webapi de MVC que usa la autenticación OAuth/token para autenticar las 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 ámbito de un atributo; se deben realizar algunas comprobaciones de autorización 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?
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.
Debería lanzar unaHttpResponseException desde su método API, no HttpException :
throw new HttpResponseException(HttpStatusCode.Unauthorized);O, si desea proporcionar un mensaje personalizado:
var msg = new HttpResponseMessage(HttpStatusCode.Unauthorized) { ReasonPhrase = "Oops!!!" }; throw new HttpResponseException(msg);Solo devuelve lo siguiente:
return Unauthorized();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
return Content(HttpStatusCode.Unauthorized, "My error message");Actualización: ASP.NET Core
El código anterior no funciona en ASP.NET Core, puede usar uno de estos en su lugar:
return StatusCode((int)System.Net.HttpStatusCode.Unauthorized, "My error message"); return StatusCode(Microsoft.AspNetCore.Http.StatusCodes.Status401Unauthorized, "My error message"); return StatusCode(401, "My error message");Aparentemente, la frase de motivo es bastante opcional ( ¿Puede una respuesta HTTP omitir la frase de motivo? )