在Session Expires-MVC3之后在POST上处理ReturnUrls

时间:2013-07-10 13:11:23

标签: asp.net asp.net-mvc session-timeout

我有一个MVC应用程序,它使用大量的Ajax请求在页面上的div中获取和发布表单。但是我偶然发现了一个经典的Ajax超时问题,我通过创建一个自定义的Authorize属性修复了该问题,该属性只返回一个401允许我通过Jquery重定向到登录页面(此时一切都很好)。

 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页面?

2 个答案:

答案 0 :(得分:0)

问题在于ForsmAuthentication模块,如果抛出401异常,它会自动重定向到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()处理程序并检查来自服务器的返回代码,如果它是401,会话已经过期,您可以采取相应的行动。

或者普遍对所有AJAX请求执行此操作。

答案 1 :(得分:0)

我发现这篇文章对我的特定场景很有帮助。 我希望这有助于其他人

http://markfreedman.com/index.php/2012/02/28/handling-session-and-authentication-timeouts-in-asp-net-mvc/