2

我有一个混合 SSL 的 web 应用程序(asp.net 3.5)。所有与帐户相关的页面均通过 SSL 提供。大多数其他页面都是通过非 SSL 交付的。为了在 HTTPS 和 HTTP 之间自动切换,我使用了这个组件。最近有一个关于在非安全 Wifi 网络上劫持用户会话的能力的新闻。这应该可以通过捕获通过非 SSL 连接传输的 Cookie 来实现。

这促使我检查了我在此 Web 应用程序中的安全选择。我(再次)从 MSDN 中获取了这篇文章,并在我的 Formsauthentication 上尝试了requireSSL=true属性。在我启动 Web 应用程序之前,我意识到我的 User.Identity 在非 SSL 页面上将为空,因为包含此信息的 cookie 不会从 Web 浏览器发送或发送到 Web 浏览器。

我需要一种通过 SSL 连接对用户进行身份验证的机制......并记住此身份验证信息,即使在非 SSL 页面上也是如此。

在搜索 SO 时,我发现了这篇文章。在我看来,这是一个很好的解决方案。但是,我想知道在Sessionstate中存储登录信息是否可以找到解决方案?我正在考虑在 Global.asax 中捕获 Application_AuthenticateRequest。检查连接是否安全并检查 authcookie 或 Session。我还不知道我将如何实现这一点。也许你可以和我一起思考这个?

4

2 回答 2

3

不幸的是,您有相互矛盾的要求。您不能通过非 SSL 进行安全会话,所以我想挑战您的基本假设:为什么不让整个站点使用 SSL?

于 2011-04-13T15:45:49.383 回答
2

从 MVC 常见问题解答(安全专家 Levi 回答的类似问题)中要求属性不使用 SSL。

• [RequireHttps] 属性可用于控制器类型或操作方法,表示“只能通过 SSL 访问”。对控制器或操作的非 SSL 请求将被重定向到 SSL 版本(如果是 HTTP GET)或被拒绝(如果是 HTTP POST)。如果您愿意,您可以覆盖 RequireHttpsAttribute 并更改此行为。没有内置的 [RequireHttp] 属性可以做相反的事情,但是如果您愿意,您可以轻松地制作自己的属性。

还有 Html.ActionLink() 的重载,它采用协议参数;您可以明确指定“http”或“https”作为协议。这是有关此类重载的 MSDN 文档。如果您未指定协议或调用没有协议参数的重载,则假定您希望链接具有与当前请求相同的协议。

The reason we don’t have a [RequireHttp] attribute in MVC is that there’s not really much benefit to it. It’s not as interesting as [RequireHttps], and it encourages users to do the wrong thing. For example, many web sites log in via SSL and redirect back to HTTP after you’re logged in, which is absolutely the wrong thing to do. Your login cookie is just as secret as your username + password, and now you’re sending it in cleartext across the wire. Besides, you’ve already taken the time to perform the handshake and secure the channel (which is the bulk of what makes HTTPS slower than HTTP) before the MVC pipeline is run, so [RequireHttp] won’t make the current request or future requests much faster.

于 2011-07-28T21:47:54.980 回答