route - Mecanismo personalizado de Asp.net Mvc para manejar solicitudes no autorizadas
tag helpers asp net core (6)
Para mi sitio web quiero los siguientes comportamientos para un controlador seguro (o acción)
si un usuario realiza una solicitud normal de redireccionamiento a la página de inicio de sesión (que puedo hacer fácilmente)
si la solicitud es del tipo Ajax Request.IsAjaxRequest()==true
, devuelva el código de estado 401
¿Cómo puedo crear un filtro para esto?
Además de la respuesta aceptada, necesitaba ingresar esta línea de código para evitar que FormsAuthentication redirigiera a la página de inicio de sesión.
filterContext.HttpContext.Response.SuppressFormsAuthenticationRedirect = true;
Entonces quité filterContext.HttpContext.Response.End ();
var unauthorizedResult = new JsonResult
{
Data = new ErrorResult() {Success = 0, Error = "Forbidden"},
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
// status code
filterContext.HttpContext.Response.StatusCode = (int) HttpStatusCode.Unauthorized;
// return data
filterContext.Result = unauthorizedResult;
filterContext.HttpContext.Response.SuppressFormsAuthenticationRedirect = true;
}
Puede usar ajaxonly para restringir el acceso a ajax actionresult
Solo puedes devolver un HttpUnauthorizedResult .
Nota: Esto podría hacer que el marco MVC lo devuelva a la página de inicio de sesión.
public ActionResult FailResult()
{
return new HttpUnauthorizedResult();
}
Su problema no es con la solicitud de AJAX, su problema es devolver HTTP 401 Respuesta no autorizada, porque usa la autenticación de formularios. Este código de respuesta le dice al marco que debe redirigir al agente de usuario a su página de inicio de sesión con una respuesta HTTP 302 en su lugar. Es por eso que fue fácil configurar la redirección de solicitud "normal", se realiza de forma automática.
Para responder a su pregunta, tuve un problema similar y la solución con la que terminé no era usar la autenticación de formularios. Implementé un atributo de autorización personalizado que maneja ambos casos manualmente en su lugar. No estoy seguro de si este es el mejor enfoque, pero funciona. Me interesa lo que otros piensan de esta solución o qué otras soluciones hay.
Afortunadamente, aún puede utilizar la clase FormsAuthentication
para FormsAuthentication
las cookies, pero debe eliminar la configuración de autenticación de formularios de su archivo Web.config. Cuando el usuario inicia sesión, utiliza FormsAuthentication.SetAuthCookie
para, bueno, configurar una cookie (probablemente ya lo esté haciendo). Segundo, en su atributo de autorización, obtiene la cookie de la solicitud y usa FormsAuthentication.Decrypt
para descifrarla. Si existe y es válido, configura al usuario en HttpContext
según esta cookie, porque la autenticación de formularios ya no lo hará por usted. Si no es así, redirigir a la página de inicio de sesión o devolver 401, dependiendo de si se trata de una llamada AJAX o no.
Una forma sencilla es hacer una comprobación en la acción de inicio de sesión.
public ActionResult SignIn()
{
if (Request.IsAjaxRequest())
{
// you could return a partial view that has this script instead
return Content("<script>window.location = ''" + Url.Action("SignIn", "Account") + "''</script>");
}
...
return View();
public class MyCustomAuthorize : AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
//if ajax request set status code and end Response
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.HttpContext.Response.StatusCode = 401;
filterContext.HttpContext.Response.End();
}
base.HandleUnauthorizedRequest(filterContext);
}
}
Cree un filtro como el de arriba, devolverá el código de estado 401 para solicitudes no autorizadas si la solicitud se realiza a través de ajax.
Si está utilizando jQuery, puede hacer lo siguiente
jQuery.ajax({
statusCode: {
401: function() {
alert(''unauthrized'');
},
/*other options*/
});