2012-11-12 62 views
3

我有一个ASP.NET MVC4子Web应用程序添加到现有的ASP.NET WebForm网站。整个网站正在使用forms authentication会话超时后Backbone Collection.fetch()

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

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

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

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

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

如果确定,我应该如何做,让骨干重定向页面登录页面,而引用当前页面?

回答

2

Here是什么东西菲尔哈克已经从后在博客

Exceprts:

可能的解决方案

我要说的是,我周围看到了一些可能的解决方案网站,然后呈现我喜欢的那个。这并不是说这些其他解决方案是错误的,但它们在某些情况下是正确的。

删除窗体身份验证

如果你不需要FormsAuth,一个简单的解决方法是删除窗体身份验证模块为this post建议。如果您唯一的目的是使用ASP.NET来托管Web API服务,并且您不需要表单身份验证,那么这是一个很好的解决方案。但如果您的应用程序既是Web应用程序又是Web服务,它不是一个好的解决方案。

注册一个HTTP模块到重定向转换为401

This blog post建议注册,其将任何302请求到401的HTTP模块有两个问题与这种方法。首先是它打破了重定向合法的情况,而不是FormsAuth的结果。第二个是它需要手动配置一个HttpModule。

安装,包装MembershipService.Mvc

我的同事史蒂夫·桑德森,与他MembershipService.Mvc和MembershipService.WebForms的NuGet包一个更好的办法。这些包将ASP.NET Membership作为可以从多个设备调用的服务公开。

从这个博客

的评论一些更多的信息,我们有同样的问题。但是我们所做的就是挂钩到AuthenticateRequest(就像你一样),并且我们也检查了请求以查看它是否是ajax(再次,就像你所做的那样)。但是在这一点上,我们只是简单地返回了一个JSON,如{location: 'http://www.domain.com/path-to-login-page'},我们只需用HTTP代码200结束该方法中的响应。这样,jQuery仍然会得到JSON结果。但是如果结果有一个“位置”属性,我们只需做一个客户端重定向到登录页面。这是我们的方式,它像一个魅力。

+0

感谢您的详细解答和选项,我会尝试您的建议并为我找到合适的解决方案,如果有任何问题需要更新。 – Shuping