如何在ajax请求返回FormsAuthentication.RedirectToLoginPage时重新加载页面?

时间:2011-09-30 09:00:43

标签: asp.net-mvc jquery forms-authentication

在asp.net mvc中使用表单身份验证时,我发现如何将ajax请求重定向到登录页面有点麻烦。

在OnAuthorize方法中,我知道请求需要授权。如果由于超时等原因删除了cookie,我想将用户重定向到登录页面。但通常请求是由jquery通过ajax请求触发的。所以请求返回登录页面的html。

那么如何将用户重定向到ajax请求的登录页面?有什么想法吗?

1 个答案:

答案 0 :(得分:3)

你可以编写一个自定义authorize属性来测试请求是否是一个AJAX请求,如果是,则返回一个包含要重定向到的url的JSON:

public class MyAuthorizeAttribute : AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        if (filterContext.HttpContext.Request.IsAjaxRequest())
        {
            // It was an AJAX request => no need to redirect
            // to the login url, just return a JSON object
            // pointing to this url so that the redirect is done 
            // on the client
            filterContext.Result = new JsonResult
            {
                JsonRequestBehavior = JsonRequestBehavior.AllowGet,
                Data = new { redirectTo = FormsAuthentication.LoginUrl }
            };
        }
        else
        {
            // standard request => redirect
            base.HandleUnauthorizedRequest(filterContext);
        }
    }
}

然后当你发出AJAX请求时:

$.get('/foo', function(result) {
    if (result.redirectTo) {
        window.location.href = result.redirectTo;
    } else {
        // standard stuff
    }
});

当然为了避免在每个AJAX调用中重复这个,你可以使用.ajaxComplete()处理程序。