【发布时间】:2014-01-02 12:26:30
【问题描述】:
Bob 使用 Web 应用程序来实现某些目标。并且:
- 他的浏览器正在节食,因此它不支持 cookies。
- Web 应用程序是一种流行的应用程序,它在特定时刻处理大量用户 - 它必须扩展。只要保持会话会限制同时连接的数量,当然会带来不可忽略的性能损失,我们可能希望有一个无会话系统:)
一些重要说明:
- 我们确实有传输安全(HTTPS 及其最好的朋友);
- 在幕后,Web 应用程序代表当前用户将大量操作委托给外部服务(这些系统确实将 Bob 识别为其用户之一)-这意味着我们必须将 Bob 的凭据转发给他们。
现在,我们如何对 Bob 进行身份验证(针对每个请求)? 哪种方式是实现这种事情的合理方式?
- 通过 HTML 表单隐藏字段使用凭据打 网球...球包含凭据(用户名和密码) 和 两个球拍 分别是浏览器和 Web 应用程序。换句话说,我们可以通过表单字段而不是通过 cookie 来回传输数据。在每个 Web 请求中,浏览器都会发布凭据。不过,在单页应用程序的情况下,这可能看起来像在橡胶墙上打壁球,而不是打网球,因为包含凭据的 web 表单 可能会在 网页 的整个生命周期内保持活动状态(并且服务器将被配置为不提供凭据)。
- 在页面上下文中存储用户名和密码 - JavaScript 变量等。此处需要单页,恕我直言。
- 基于加密令牌的身份验证。在这种情况下,登录操作将导致生成加密的安全令牌(用户名 + 密码 + 其他内容)。该令牌将返回给客户端,并且即将到来的请求将伴随该令牌。这有意义吗?我们已经有了 HTTPS...
- 其他...
- 最后的手段:不要这样做,在会话中存储凭据!会话很好。带或不带 Cookie。
对于前面描述的任何想法,您是否想到了任何网络/安全问题?例如,
- 超时 - 我们可能会保留一个时间戳以及凭据(时间戳 = Bob 输入他的凭据的时间)。例如。当NOW - timestamp > threshold时,我们可能会拒绝该请求。
- 跨站点脚本保护 - 应该没有任何不同,对吧?
非常感谢您花时间阅读本文:)
【问题讨论】:
-
您可以将令牌附加到每个 URL。 ASP.NET 有一个(传统)模式可以做到这一点。这证明它可以工作。
-
大家都在哪里? :)
-
我认为您对可用的选项有一个很好的了解。相信你的推理并自己决定。
-
是像silverlight of flash这样的插件吗?
-
尝试使用 JSON Web 令牌 (JWT) jwt.io
标签: security authentication session-cookies stateless cookieless