在控制器中授权Ajax Action方法的属性

时间:2011-11-02 02:51:55

标签: jquery asp.net-mvc asp.net-mvc-3 forms-authentication

我试图在我的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而言,我是一个相对新手的程序员,所以我想在实际实现代码之前我会要求其他意见。

1 个答案:

答案 0 :(得分:3)

这是blog post,我强烈建议您阅读。它说明了处理这个问题的更好方法。