c# asp.net-mvc authorization

c# - API web ASP.NET: forma correcta de devolver una respuesta 401/no autorizada



asp.net-mvc authorization (5)

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(401, "My error message");

Aparentemente, la frase de razón es bastante opcional ( ¿Puede una respuesta HTTP omitir la Frase de razón? )

Tengo un sitio de MVC webapi que usa autenticación OAuth / token para autenticar solicitudes. Todos los controladores relevantes tienen los atributos correctos, y la autenticación funciona bien.

El problema es que no todas las solicitudes se pueden autorizar en el ámbito de un atributo; algunas comprobaciones de autorización se deben realizar en el código invocado por los métodos del controlador. ¿Cuál es la forma correcta de devolver una respuesta no autorizada 401 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 registro DelegatingHandler podemos ver que la respuesta es 500, no 401.


Debería lanzar una HttpResponseException 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);


Obtiene un código de respuesta 500 porque está lanzando una excepción (la 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

Response.StatusCode = (int)HttpStatusCode.Unauthorized;


Solo devuelve lo siguiente:

return Unauthorized();


puede usar el código de seguimiento en asp.net core 2.0:

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