我试图在我的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并从那里执行重定向。这里是我都忍了在Ajax上授权属性控制器中的操作方法
在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而言,我是一个相对新手的程序员,所以我想在实际执行代码之前我会询问其他意见。
2011-11-02
Jatin