2009-05-15 18 views
5

Al crear un sistema de gestión de contenido que incorpora jquery ajax en su GUI me he topado con un obstáculo. Parece que algunos clientes pasan demasiado tiempo pensando en lo que van a escribir y, por lo tanto, la sesión del servidor los cierra, ya que naturalmente no tienen ni idea de esto. Cuando intentan enviar los cambios, uso una llamada ajax al servidor para guardar los datos.Comprobación de la autorización http en mvc antes de la publicación de formulario ajax

Lo que esperaría que sucediera a continuación es que la aplicación del servidor MVC devolvería un estado "401 no autorizado". Entonces podría obtener mi objeto jquery ajax para pedirle al usuario que inicie sesión y luego volver a enviar los cambios una vez que el usuario haya sido autorizado.

Sin embargo, lo que realmente se devuelve de la aplicación MVC es un estado "302 Encontrado" y una URL de redirección a mi página de formulario de inicio de sesión. La página de formulario de inicio de sesión devuelve un código de estado "200 OK" y el objeto jquery ajax llama al evento de éxito que le dice al usuario que todo fue exitoso porque eso es lo que dice la aplicación MVC.

¿Hay alguna manera de que la aplicación MVC se reproduzca de la manera que creo que debería o debo modificar mis eventos jquery ajax para detectar la página de inicio de sesión?

Actualización:

he utilizado reflector para echar un vistazo en el código MVC y el atributo autorizar, devolver un NotAuthorizedResult el código que está por debajo (0x191 = 401)

public override void ExecuteResult(ControllerContext context) 
{ 
    if (context == null) 
    { 
     throw new ArgumentNullException("context"); 
    } 
    context.HttpContext.Response.StatusCode = 0x191; 
} 

Estoy pensando que tal vez la Autorización de formularios HttpModule está viendo el 401 y forzando la redirección.

Respuesta

6

usted podría intentar algo como esto:

void context_EndRequest(object sender, EventArgs e) 
    { 
     var app = sender as HttpApplication; 
     var response = app.Response; 
     var request = app.Request; 

     if ((response.StatusCode == 302) && IsAjaxRequest(request)) 
      response.StatusCode = 401; 
    } 

en un HttpModule, será después del módulo FormsAuth por este orden por corregirá el código de estado. No es bonito, pero efectivo.

+0

En .Net 4.0 (quizás otras versiones también, no sé), FormsAuthentication realiza la redirección en el controlador EndRequest.Descubrí que FormsAuth no procesó la respuesta si utilicé EndRequest, pero el uso del evento PreSendRequestHeaders funcionó mucho mejor (viene después de EndRequest). Gracias por este gran mensaje. – womp

5

Me gusta mucho esta solución. Al cambiar la respuesta 302 en solicitudes ajax a una 401, le permite configurar su ajax en el lado del cliente para monitorear cualquier solicitud ajax buscando un 401 y si encuentra uno para redirigir a la página de inicio de sesión. Muy simple y efectivo.

Global.asax:

protected void Application_EndRequest() 
{ 
    if (Context.Response.StatusCode == 302 && 
     Context.Request.Headers["X-Requested-With"] == "XMLHttpRequest") 
    { 
     Context.Response.Clear(); 
     Context.Response.StatusCode = 401; 
    } 
} 

Clientes Código lateral:

$(function() { 
     $.ajaxSetup({ 
     statusCode: { 
      401: function() { 
      location.href = '/Logon.aspx?ReturnUrl=' + location.pathname; 
      } 
     } 
     }); 
    }); 
1

he encontrado que un enfoque más ligero es simplemente agregar un encabezado HTTP personalizado a la página de inicio de sesión y luego verificar para la presencia de eso en la devolución de llamada de éxito de AJAX.

Ie. en el LoginController (este es un proyecto de MVC, pero el mismo principio debe aplicarse a otras soluciones ASP.NET):

public ActionResult Login(string returnUrl = "") 
{ 
    Response.AddHeader("X-Unauthorized", "true"); 
    ... 

Y luego, en el lado del cliente AJAX manejador:

success: function(data, textStatus, jqXhr) 
{ 
    if (jqXhr.getResponseHeader("X-Unauthorized")) 
    { 
     ... 

Estos trabajos al menos para mí.

Cuestiones relacionadas