2011-07-31 16 views
6

En mi proyecto MVC3, tengo un controlador con un atributo [Autorizar]. Tengo una presentación de formulario sin ajax, que redirige al usuario (como se esperaba) a la pantalla de inicio de sesión, si él/ella no ha iniciado sesión.mvc 3, jquery ajax y autenticación de formularios

Sin embargo, ahora tengo un formulario que se envía con jquery ajax, y ¿cómo puedo hacer lo mismo? ¿Redirige al usuario a la pantalla de inicio de sesión, si él/ella no está autorizado? Después de un inicio de sesión exitoso, el usuario debe ser redirigido a la acción inicial.

controlador

[Authorize] 
[ValidateInput(false)] 
public JsonResult SubmitChatMessage(string message) 
     { 
      if (!string.IsNullOrEmpty(message)) 
      { 
       // Do stuff 
      } 

      // Return all chat messages 
      return GetChatMessages(); 
     } 

JQUERY cliente

$(document).ready(function() { 
    $("form[action$='SubmitChatMessage']").submit(function (event) { 
     $.ajax({ 
      url: $(this).attr("action"), 
      type: "post", 
      dataType: "json", 
      data: $(this).serialize(), 
      success: function (response) { 
       // do stuff 
      } 
     }); 
     return false; 
    }); 
}); 

puedo ver desde la ventana de la consola de Firebug, que devuelve el servidor:

GET http://domain/Account/LogOn?ReturnUrl=%2fProductDetails%2fSubmitChatMessage 

Mirando hacia adelante a su ayuda !

actualiza con las posibles soluciones

+0

¿De qué sirve un inicio de sesión AJAX si lo que hace es redireccionar de todos modos? ¿Por qué no solo usar un formulario regular? – RPM1984

+0

El punto es que los usuarios que inician sesión deberían poder enviar algunos datos a un controlador con ajax. ¿Qué hacer si no están conectados? ¿Cómo manejar ese escenario con jquery ajax? – Nima

+0

bien, mi mal - no entendí bien. Respuesta agregada – RPM1984

Respuesta

6

Sí, esta es una de las cosas que siempre he odiaba sobre la Autenticación de formularios en ASP.NET - no admite la autenticación AJAX en absoluto. Agregue IIS manejando 401 en la mezcla, y puede ser bastante doloroso.

Hay algunas maneras de hacerlo, ninguna de ellas particularmente "limpia".

Estos incluyen:

  1. Establecer un indicador ViewBag en el controlador, lo que corresponde a Request.IsAuthenticated, a continuación, volver a escribir el evento de clic de botón enviar a la página de inicio de sesión si no están autenticados.

  2. Haga que su acción AJAX devuelva JsonResult, que es una propiedad para "código". Donde un código de 0 puede ser exitoso, 1 puede no ser autenticado, 2 puede ser algún otro problema de datos, etc. Luego verifique que el código esté en la devolución de llamada complete$.ajax y redirija a la página de inicio de sesión.

  3. Comprobar el objeto respuesta $.ajaxjqXHR para un código de estado de 403, y redirigir a la página de inicio de sesión.

  4. Escriba un ayudante de HTML personalizado para su botón de envío, que representa ya sea un botón de envío regular, o una etiqueta de anclaje que va a la página de inicio de sesión, dependiendo del estado de autenticación.

  5. Escriba un atributo de autorización personalizado que comprueba si Request.IsAjaxRequest(), y devuelve un objeto JSON personalizado, en lugar del comportamiento predeterminado que es redirigir a la página de inicio de sesión (lo que no sucede con las solicitudes AJAX).

+0

Gracias por las diferentes soluciones. Actualizaré mi pregunta con otras publicaciones relacionadas con su respuesta, que ofrece una descripción más detallada de las diferentes soluciones. – Nima

+0

¿Podría hacer un redireccionamiento a la acción (a un tiempo de espera de sesión o pantalla de inicio de sesión?), En la función C#, si el usuario no ha iniciado sesión? – nagates

0

Es un poco de dolor, para ser honesto. Aún más, en mi opinión, si usa Identidad Federada, como Windows Identity Foundation y/o Azure AppFabric Access Control Service.

Sus llamadas Ajax no pueden manejar la redirección.

Mi solución/sugerencia no es marcar los métodos de acción invocados por Ajax con [Authorize], sino confiar en la presencia de algún valor que inserte en Session State desde una acción de controlador que tenga un [Authorize] (por lo general, el método de acción del controlador que se llamó para mostrar la vista). Usted sabe que el valor no puede haber entrado en el estado de sesión a menos que el usuario haya sido autenticado (y la sesión no haya excedido el tiempo de espera). Falla la llamada a su método Ajax si este valor no está presente, devolviendo un resultado JSON específico que puede manejar con gracia en su código del lado del cliente.

El uso de [Authorize] en un método de controlador Ajax causa errores extraños, a menudo ocultos (como la desaparición de las actualizaciones).

+0

Tienes razón, es un gran dolor. En realidad, es una buena solución para usar el estado de la sesión, lo consideraré. – Nima

Cuestiones relacionadas