2011-03-10 29 views
26

He utilizado la función jquery ajax para enviar un formulario. Los usuarios tienen que iniciar sesión o deben redirigir a una página de inicio de sesión. He utilizado el atributo Authorize() para ello.Autorizar el atributo y jquery AJAX en asp.net MVC

[Authorize] 
public ActionResult Creat() 
{ 
.... 
} 

Si el usuario no está acceder a la página de inicio de sesión acción de retorno a las funciones ajax de jQuery y que se muestra en la misma página, pero quiero redirigir al usuario a la página de acceso. ¿Hay alguna solución?

Respuesta

0

Ajax se utiliza para actualizar parcialmente el contenido de una página, por lo que sería mejor que maneje esta redirección en su lado del cliente, en su código de javascript/jquery. También puede obtener una idea de este post.

66

ejemplo de trabajo: https://github.com/ronnieoverby/mvc-ajax-auth

partes importantes:

AjaxAuthorizeAttribute:

using System.Web.Mvc; 

namespace MvcApplication1 
{ 
    public class AjaxAuthorizeAttribute : AuthorizeAttribute 
    { 
     protected override void HandleUnauthorizedRequest(AuthorizationContext context) 
     { 
      if (context.HttpContext.Request.IsAjaxRequest()) 
      { 
       var urlHelper = new UrlHelper(context.RequestContext); 
       context.HttpContext.Response.StatusCode = 403; 
       context.Result = new JsonResult 
       { 
        Data = new 
        { 
         Error = "NotAuthorized", 
         LogOnUrl = urlHelper.Action("LogOn", "Account") 
        }, 
        JsonRequestBehavior = JsonRequestBehavior.AllowGet 
       }; 
      } 
      else 
      { 
       base.HandleUnauthorizedRequest(context); 
      } 
     } 
    } 
} 

Javascript:

$(function() { 
     $(document).ajaxError(function (e, xhr) { 
      if (xhr.status == 403) { 
       var response = $.parseJSON(xhr.responseText); 
       window.location = response.LogOnUrl; 
      } 
     }); 
    }); 

utilizar el atributo en un controlador:

[AjaxAuthorize] 
    public ActionResult Secret() 
    { 
     return PartialView(); 
    } 

Haga un poco de ajax:

@Ajax.ActionLink("Get Secret", "Secret", new AjaxOptions { UpdateTargetId = "secretArea", }) 

<div id="secretArea"></div> 
+2

Totally awesome Ronnie! ¡Me encanta cuando una solución simplemente funciona! Ghooti necesita marcar esta respuesta ... –

+0

@BenPower ¡Gracias por las palabras alentadoras! Me alegro de poder ayudar. –

+3

Tener una medalla de bronce –

7

Sólo una adición útil a la respuesta de Ronnie #

si desea mantener la URL de la página de redirección.

var pathname = window.location.pathname; 
     if (xhr.status == 403) { 
       var response = $.parseJSON(xhr.responseText); 
       window.location = response.LogOnUrl + '?ReturnUrl=' + pathname; 
      } 
+0

Solución más fácil imo: 'returnUrl = context.HttpContext.Request.UrlReferrer.LocalPath' para routeValues ​​of' urlHelper.Action' –

0

Como otra extensión de la respuesta de Ronnie Overby.

Su solución no funciona con webapi, pero esto está bien porque en su lugar puede usar el atributo Autorizar normal y luego manejar el estado 401 en la función ajaxError de la siguiente manera.

$(document).ajaxError(function (e, xhr) { 
    //ajax error event handler that looks for either a 401 (regular authorized) or 403 (AjaxAuthorized custom actionfilter). 
    if (xhr.status == 403 ||xhr.status == 401) { 
     //code here 
    } 
}); 
Cuestiones relacionadas