这是菲尔·哈克在博客上写的
帖子摘录:
可能的解决方案
我将介绍一些我在网上看到的可能的解决方案,然后介绍我喜欢的一个。并不是说这些其他解决方案是错误的,而是它们仅在某些情况下是正确的。
删除表单身份验证
如果您不需要 FormsAuth,一个简单的解决方案是按照本文的建议删除表单身份验证模块。如果您的唯一目的是使用 ASP.NET 来托管 Web API 服务并且不需要表单身份验证,那么这是一个很好的解决方案。但如果您的应用程序既是 Web 应用程序又是 Web 服务,这不是一个很好的解决方案。
注册一个 HttpModule 以将重定向转换为 401
这篇博文建议注册一个将任何 302 请求转换为 401 的 HTTP 模块。这种方法有两个问题。首先是它打破了重定向是合法的而不是 FormsAuth 的结果的情况。第二个是它需要手动配置一个 HttpModule。
安装包 MembershipService.Mvc
我的同事 Steve Sanderson 使用他的 MembershipService.Mvc 和 MembershipService.WebForms NuGet 包有一个更好的方法。这些包将 ASP.NET 成员身份公开为可以从多个设备调用的服务。
来自此博客评论的更多信息
我们遇到了同样的问题。但是我们所做的是挂钩到 AuthenticateRequest(就像您所做的那样),我们还检查了请求以查看它是否是 ajax(再次,就像您所做的那样)。但是此时,我们只是返回了一个类似 JSON 的内容,{location: 'http://www.domain.com/path-to-login-page'}
并且我们只是在该方法中以 HTTP 代码 200 结束了响应。这样,jQuery 仍然得到一个 JSON 结果。但如果结果具有“位置”属性,我们只需将客户端重定向到登录页面。这就是我们的方式,它就像一个魅力。