0

我在 asp.net MVC 应用程序上使用表单身份验证,并使用 jquery 和 ajax 创建丰富的用户界面。一些用户倾向于将页面打开数小时,并且他们的登录会话按预期到期。如果用户单击链接或重新加载页面,则会按预期返回登录屏幕。如果他们单击按钮或触发 ajax 调用,则 ajax 调用将返回登录 html 而不是预期的 html 或 JASON 结果。导致页面出现半个登录屏幕的混乱页面。

因为我已经编写了很多 ajax 调用,所以我想我可以扩展或覆盖默认的 .done 事件,以在继续我编写的任何事件之前添加对登录屏幕的检查。

例如我有这个功能:

function CallAjax() {
    $.ajax({type: "GET", url: "foo" })
     .done(function (data) { $('#result').val(data); });
}

是否可以覆盖 .done 的默认实现,以便在不重写此函数的情况下进行检查?我的检查可能会查看结果是否为 html 响应,如果是,则搜索“登录”以查看其是否为登录页面。

4

2 回答 2

0

我建议您按照 Phil Haack 的解释扩展 ASP.NET 表单身份验证模块,this blog post以便在使用 AJAX 请求时不再重定向到登录页面,而是返回 401 HTTP 状态代码。然后您可以简单地使用.fail回调并拦截 401 状态代码。在这种.done情况下不会调用处理程序。

于 2012-11-14T14:33:56.943 回答
0

我尝试了达林的建议,但经过数小时的尝试,我无法让它在我的设置中发挥作用。然而,我偶然发现了这个相当简单的解决方案,它第一次对我有用:

只需将其添加到 global.asax

protected void Application_EndRequest()
{
    var context = new HttpContextWrapper(this.Context);

    if (FormsAuthentication.IsEnabled && 
        context.Response.StatusCode == 302 &&
        context.Request.IsAjaxRequest())
        {
            context.Response.Clear();
            context.Response.StatusCode = 401;
        }
    }
}

取自http://jvance.com/blog/2012/09/21/FixFormsAuthentication302.xhtml

于 2012-11-14T17:19:25.730 回答