带有ASP.NET MVC的JSON请求的401响应代码
如何为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; } }