first jquery asp.net-mvc asp.net-mvc-3 http-status-code-401 unauthorized

jquery - first - Resultado no autorizado en solicitudes ajax



jquery get id (4)

Tengo una aplicación con muchas acciones ajax (implementada usando JQuery.ajax), que devuelve JSON a html. Algunos de ellos deberían ser accesibles solo para usuarios autorizados, y los decoré con el atributo [Authorize] . Para acciones no ajax, si el usuario no está autorizado, el sistema lo redirige a la página de inicio de sesión (que está configurada en web.config).

Pero esto no es aplicable a las acciones ajax, porque si el usuario estaba autorizado: cargar la página, después de que la cookie caduque y no esté autorizado, y en lugar del bloque html, que debe reemplazar al anterior, obtiene mi página de inicio de sesión dentro del bloque.

Sé que puedo resolver este problema manualmente, por ejemplo, eliminar el atributo [Autorizar] y devolver un json especial / vacío html, si el usuario no está autorizado. Pero no me gusta esta solución, porque necesito volver a escribir todas mis acciones y funciones ajax. Quiero una solución global, que me permita no reescribir mis acciones (puede ser un atributo de autorización personalizado o un manejo personalizado de resultados no autorizados de http).

Quiero devolver el código de estado, si la solicitud es ajax, y redirigir a la página de inicio de sesión, si la solicitud no es ajax.


Agregue un controlador Application_EndRequest a su código en global.asax.cs que modifique cualquier error 302 (redirigir a la página de inicio de sesión) a un error 401 (no autorizado) para una solicitud AJAX. Esto le permitirá simplemente dejar las acciones de su controlador como están y manejar la redirección (en realidad, solo puede hacer que el usuario vuelva a iniciar sesión si no está actualmente) a través del cliente.

protected void Application_EndRequest() { // Any AJAX request that ends in a redirect should get mapped to an unauthorized request // since it should only happen when the request is not authorized and gets automatically // redirected to the login page. var context = new HttpContextWrapper( Context ); if (context.Response.StatusCode == 302 && context.Request.IsAjaxRequest()) { context.Response.Clear(); Context.Response.StatusCode = 401; } }

Luego, en su archivo _Layout.cshtml, agregue un controlador de errores AJAX global que redirige a su acción de inicio de sesión cuando recibe una respuesta 401.

<script type="text/javascript"> $(function () { $(document).ajaxError(function (e, xhr, settings) { if (xhr.status == 401) { location = ''@Url.Action( "login", "account" )''; } }); }); </script>

También es posible que desee probar algunas de las técnicas descritas en el blog de Phil Haack, Redirigir la página de inicio de sesión de Autenticación de formularios cuando no lo desee



Puede verificar el método de extensión Request.IsAjaxRequest () y realizar una acción específica si es verdadera.


Tal vez su acción LogOn en su AccountController (o donde sea que la tenga) podría devolver un resultado diferente si Request.IsAjaxRequest() fuera verdadero.

Esto significa que si una llamada AJAX a una acción autorizada falla la autorización, debería poder devolver una respuesta apropiada a través de la acción LogOn.

p.ej

public ActionResult LogOn() { if (Request.IsAjaxRequest()) { // do appropriate response for ajax call here } return View(); }

Entonces, no deberías tener que hacer una reescritura importante