【发布时间】:2015-11-18 03:01:10
【问题描述】:
这里的场景:
域 A 上有一个网页。用户正在域 A 中进行身份验证(并将身份验证令牌保存在 sessionStorage 中),并在那里进行一些活动。然后用户需要转到域 B 上的页面。一旦他从域 B 登陆页面,该页面应该以某种方式保留域 A 的身份验证令牌。我控制域 B 的服务器。
最简单的方法是在域 A 的页面上设置一个按钮,类似于
location.href = 'domainB.com/?authtoken=mytoken'
我面临的问题来了:
1) 我不能(又名强烈不希望)在 URL 中使用查询参数,即使连接是 https:URL(通常)已被记录,并且任何攻击都会轻易窃取令牌身份验证,这是一个安全漏洞。
2) 我不想设置跨域 cookie - 相同的原因(安全性)。
3) domainB 应用程序是基于 API 的,服务器和客户端是无会话的。所有身份验证令牌都位于 sessionStorage 中以防止安全漏洞。
过去几天我做了很多谷歌搜索,但似乎我无法为跨域页面加载添加自定义标题。 'POST' 不会重新加载页面。到目前为止,我能够发明的唯一选择是放弃使用服务器端会话,即:
a) 在从域 A 导航到 B 之前,请求服务器 B 创建一次性使用的会话密钥。
b) 使用该会话密钥的查询参数导航到域 B。
c) 一旦域 B 上的服务器收到带有会话密钥的“GET”请求,检索关联的身份验证令牌,丢弃会话密钥(即有效地将其设为一次性),并在标头中使用身份验证令牌提供页面。
这种方法的问题:
它迫使我使用服务器端会话,即显着降低性能。
身份验证令牌(但暂时)保存在域B服务器端会话中,这增加了整个系统的安全漏洞。
仍然对中间人攻击持开放态度。
还有其他建议吗?别人是怎么解决的?我不认为每个人都在使用 URL 查询参数这样的安全失败。
【问题讨论】:
标签: security authentication cross-domain