2013-07-10 26 views
0

我有一个MVC应用程序,它使用大量的Ajax请求来获取和张贴页面上的div内的表单。然而,我偶然发现了我已经修复的经典Ajax超时问题创建一个自定义的Authorize属性,它只是返回一个401,它允许我通过Jquery重定向到登录页面(这一切都很好,很好)。在会话过期后处理POST上的ReturnUrls MVC3

public class AjaxAuthorizeAttribute : AuthorizeAttribute 
    { 
     protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
     { 
      if (filterContext.HttpContext.Request.IsAjaxRequest()) 
      { 
       filterContext.HttpContext.Items["AjaxRequestPermissionDenied"] = true; 

      } 
      base.HandleUnauthorizedRequest(filterContext); 
     } 
    } 

但是当我做一个表单的正常服务器端提交时,会话已过期,我重定向到登录表单正常的,但与形式参数在URL即 Login/Login.aspx?ReturnUrl=%2fTest%2fComp%2fSite%2f4。 因此,当我重新登录时,无法将表单重新插入所需的div中,因为这是最初调用它的页面中的一个单独URL。

接下来的问题是,我将如何处理这种情况,以便我们总是重定向到默认的登录页面,或者最好是重定向到带有指向登录页面的链接的generac Timeout页面?

回答

0

问题在于如果引发401异常,ForsmAuthentication模块会自动重定向到SignIn表单。 Phil Haack blogged关于如何覆盖AJAX请求的这种行为。

所以一旦你安装的NuGet你可以简单地订阅到你的AJAX的401错误调用:

$.ajax({ 
    url: '/admin/secret/data', 
    type: 'POST', 
    contentType: 'application/json; charset=utf-8', 
    statusCode: { 
     200: function (data) { 
      alert('200: Authenticated'); 
      // Bind the JSON data to the UI 
     }, 
     401: function (data) { 
      alert('401: Unauthenticated'); 
      // Handle the 401 error here. 
     } 
    } 
}); 

或通过订阅全球.ajaxError()处理程序,并检查返回代码做通用于所有的AJAX请求从服务器,如果它是401会话已过期,你可以采取相应的行动。

+0

感谢达林。我已经排序了Ajax位。我遇到的问题是经典的asp.net表单提交(通过Submit buitton),在会话超时时具有值。我得到一个重定向到登录页面,但它带回了参数,这是与表单身份验证的默认行为。我想排除返回Url? – lacoder