我试图在我的MVC3应用程序中授权ajax动作方法。当用户会话到期并要求执行ajax操作方法时,会发生此问题。 asp.net身份验证系统发送302重定向而不是发送401,这似乎是非Ajax请求的逻辑。但是使用Ajax,这一切都很快搞砸了。所以我决定遵循ASP.NET MVC forces an AJAX request be redirected to the login page when the FormsLogin session is no longer active建议的方法。 基本上,在请求结束时,我们检查请求是否是ajax请求并且存在重定向(302响应)。如果是,那么我们将响应代码从302替换为401.因此在javascript中我们检查401并从那里执行重定向。这是我提出的基本代码
在Global.asax.cs
中 protected void Application_EndRequest() {
var context = new HttpContextWrapper(Context);
// If we're an ajax request, and doing a 302, then we actually need to do a 401
if (Context.Response.StatusCode == 302 && context.Request.IsAjaxRequest()) {
Context.Response.Clear();
Context.Response.StatusCode = 401;
}
}
在JQuery全局错误处理程序中(包含在asp.net mvc主页:_Layout.cshtml中)
$(document).ajaxError(function (event, jqXHR, ajaxSettings, thrownError) {
if (jqXHR.status == 401) {
window.location.replace(loginUrl);
}
});
我刚刚快速测试了这段代码,似乎工作正常。此代码是否存在任何潜在问题。就asp.net mvc和jquery而言,我是一个相对新手的程序员,所以我想在实际实现代码之前我会要求其他意见。