我在现有的ASP.NET WebForm网站中添加了一个ASP.NET MVC4子Web应用程序。整个网站正在使用forms authentication
。
在我的MVC4客户端,我使用Backbone.js
来构建应用程序,而客户端应用程序很可能是SPA。
一切正常,但在会话超时后,我的应用程序不会重定向到登录页面。
我在Collection.fetch方法上尝试了错误回调,它在会话超时后尝试获取时被触发(这很好)。
但是,响应状态代码为200(OK),响应内容是登录页面内容。
所以,我的问题是,在错误处理程序中,我如何知道回调是否由会话超时或任何其他意外错误触发?
如果确定,我应该如何在引用当前页面时让Backbone重定向页面登录到页面?
答案 0 :(得分:2)
Here是Phil Haack写博客的内容
帖子中的例外情况:
可能的解决方案
我将介绍我在网络上看到的一些可能的解决方案,然后展示我喜欢的解决方案。并非这些其他解决方案都是错误的,但在某些情况下它们只是正确的。
删除表单身份验证
如果您不需要FormsAuth,一个简单的解决方案是删除表单身份验证模块,如this post所示。如果您的唯一目的是使用ASP.NET来托管Web API服务并且您不需要表单身份验证,那么这是一个很好的解决方案。但如果您的应用程序既是Web应用程序又是Web服务,那么这不是一个很好的解决方案。
注册HttpModule以将重定向转换为401
This blog post建议注册一个HTTP模块,将任何302请求转换为401.这种方法存在两个问题。首先,它打破了重定向是合法的情况,而不是FormsAuth的结果。第二是它需要手动配置HttpModule。
安装包MembershipService.Mvc
我的同事Steve Sanderson使用他的MembershipService.Mvc和MembershipService.WebForms NuGet包有更好的方法。这些包将ASP.NET成员资格公开为可以从多个设备调用的服务。
此博客评论的更多信息
我们遇到了同样的问题。但我们所做的是挂钩AuthenticateRequest(就像你做的那样),我们也检查了请求是否是ajax(再次,就像你做的那样)。但是在这一点上,我们只返回了一个类似{location: 'http://www.domain.com/path-to-login-page'}
的JSON,我们只是用HTTP代码200结束了该方法的响应。这样,jQuery仍然得到一个JSON结果。但是如果结果具有“位置”属性,我们只需执行客户端重定向到登录页面。这是我们的方式,它就像一个魅力。