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

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

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

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

您可以编写一个自定义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()处理程序。