带有ASP.NET MVC的JSON请求的401响应代码

时间:2020-03-06 14:37:34  来源:igfitidea点击:

如何为AJAX / JSON请求禁用401响应代码(重定向到登录页面)的标准ASP.NET处理?

对于网页来说可以,但是对于AJAX,我需要获取正确的401错误代码,而不是登录页面的302/200。

更新:
来自ASP.NET MVC的PM的Phil Haack提供了几种解决方案,http://haacked.com/archive/2011/10/04/prevent-forms-authentication-login-page-redirect-when-you-donrsquot-want aspx

解决方案

我们可以选择创建一个自定义的FilterAttribute来实现IAuthorizationFilter接口。

在此属性中,添加逻辑以确定请求是否应该返回JSON。如果是这样,我们可以在用户未登录的情况下返回一个空的JSON结果(或者执行我们喜欢的任何操作)。对于其他响应,我们只需照常重定向用户即可。

甚至更好的是,我们可以重写AuthorizeAttribute类的OnAuthorization,这样就不必重新发明轮子。添加我上面提到的逻辑,并在filterContext.Cancel为true时进行拦截(将filterContext.Result设置为HttpUnauthorizedResult类的实例。

在Phil Haacks博客上阅读有关" ASP.NET MVC CodePlex Preview 4中的过滤器"的更多信息。它也适用于最新预览。

开发ASP.NET运行时,以便在将HttpResponse.StatusCode设置为401时始终将重定向用户,但前提是找到Web.config的<authentication />`部分。

删除身份验证部分将需要我们在属性中实现对登录页面的重定向,但这并不重要。

我们也可以使用Global.asax来中断此过程,如下所示:

protected void Application_PreSendRequestHeaders(object sender, EventArgs e) {
        if (Response.StatusCode == 401) {
            Response.Clear();
            Response.Redirect(Response.ApplyAppPathModifier("~/Login.aspx"));
            return;
        }
    }

在经典的ASP.NET中,使用Ajax调用WebMethod时会收到401 http响应代码。我希望他们会在ASP.NET MVC的未来版本中对其进行更改。现在,我正在使用此hack:

protected void Application_EndRequest()
{
    if (Context.Response.StatusCode == 302 && Context.Request.Headers["X-Requested-With"] == "XMLHttpRequest")
    {
        Context.Response.Clear();
        Context.Response.StatusCode = 401;
    }
}