3

我在现有的 ASP.NET WebForm 网站中添加了一个 ASP.NET MVC4 子 Web 应用程序。整个网站正在使用forms authentication.

在我的 MVC4 客户端中,我Backbone.js用于构建应用程序,客户端应用程序很可能是一个 SPA。

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

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

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

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

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

4

1 回答 1

2

是菲尔·哈克在博客上写的

帖子摘录:

可能的解决方案

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

删除表单身份验证

如果您不需要 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 结果。但如果结果具有“位置”属性,我们只需将客户端重定向到登录页面。这就是我们的方式,它就像一个魅力。

于 2012-11-12T06:56:25.007 回答