0

我有一个 MVC 应用程序,它使用大量 Ajax 请求来获取和发布页面上的 div 中的表单。但是我偶然发现了经典的 Ajax 超时问题,我通过创建一个只返回一个 401 的自定义 Authorize 属性来解决这个问题,它允许我通过 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。

那么问题是,我将如何处理这种情况,以便我们始终被重定向到默认登录页面,或者最好重定向到带有登录页面链接的通用超时页面?

4

2 回答 2

0

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

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

于 2013-07-11T12:35:19.410 回答
0

问题出在 ForsmAuthentication 模块上,如果抛出 401 异常,该模块会自动重定向到 SignIn 表单。Phil Haackblogged关于如何覆盖 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,则会话已过期,您可以采取相应措施。

于 2013-07-10T13:14:05.577 回答