会话超时后的Backbone Collection.fetch()



我在现有的ASP.NET WebForm网站中添加了一个ASP.NET MVC4子web应用程序。整个网站都在使用CCD_ 1。

在我的MVC4客户端中,我使用Backbone.js来构建应用程序,并且客户端应用程序很可能是SPA。

一切正常,但在会话超时后,我的应用程序不会重定向到登录页面。

我尝试了Collection.fetch方法的错误回调,它是在会话超时后尝试提取时触发的(这很好)。

但是,响应状态代码为200(OK),响应内容为登录页面内容。

所以,我的问题是,在错误处理程序中,我如何知道回调是由会话超时还是任何其他意外错误触发的?

如果确定了,在引用当前页面时,我应该如何让Backbone将页面重定向到登录页面?

以下是Phil Haack关于的博客文章

文章节选:

可能的解决方案

我将介绍我在网上看到的一些可能的解决方案,然后介绍我喜欢的解决方案。这并不是说这些其他解决方案是错误的,但它们只是在某些情况下是正确的。

删除表单验证

如果您不需要FormsAuth,一个简单的解决方案是按照本文的建议删除表单身份验证模块。如果您的唯一目的是使用ASP.NET承载Web API服务,并且不需要表单身份验证,那么这是一个很好的解决方案。但如果你的应用程序既是网络应用程序又是网络服务,那就不是一个好的解决方案。

注册HttpModule以将重定向转换为401

这篇博客文章建议注册一个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结果。但如果结果具有"location"属性,我们只需在客户端重定向到登录页面。这就是我们的方式,它就像一种魅力。

最新更新