我在不同的域上有两个站点。我正在使用Thinktecture IdentityModel实现SSO。
用户登录到站点A.在某些时候,他们会点击链接将他们带到站点B.站点A将用户重定向到站点B / Login.aspx?token =<令牌>使用JWT令牌。然后,站点B通过调用站点A上的API来验证用户身份,从而验证令牌。如果经过身份验证,则用户将自动登录到站点B.
默认情况下,Thinktecture令牌持续10个小时,无法杀死令牌(据我所知)。如果用户退出站点,则令牌仍然有效。我可以查看浏览器历史记录并获取“Login.aspx?token =< token>” url并自动重新登录。有没有办法在他们注销时终止所有用户令牌?令牌不应作为查询字符串的一部分传递吗?防止重播攻击的最佳方法是什么?
答案 0 :(得分:1)
正如@leastprivilege对您的问题所评论的那样,只需将两个网站定义为信任相同IDP的RP(信赖方),即可轻松实现两个网站的SSO。这当然会简化您的身份验证解决方案架构。
话虽如此,使用WS-Fed的被动身份验证仍然容易受到重放攻击。虽然令牌已发布到您的网站,但在您的浏览器上“退回”几次(即使在退出后)也会将令牌重新发布到您的网站,并会将用户重新签名。
幸运的是,WIF有办法减轻这种攻击。通过配置:
<identityConfiguration>
.......
<tokenReplayDetection enabled="true" />
.....
</identityConfiguration>
然后,Wif将已使用的令牌缓存在服务器上,并确保它只使用一次。 (如果检测到重播攻击,则会引发适当的异常SecurityTokenReplayDetectedException
)。
此缓存当然不会在进程回收中存在,并且在Web场方案中是不够的。如果你想在这些场景中缓解这种攻击,你还需要某种分布式的攻击方式。持久缓存。
我实现了一个a contribution to Thinktecture.IdentityModel,您可以查看并使用它。
答案 1 :(得分:0)
听起来像标记应该解决问题,至少在你描述的这个最明显的场景中。没有使用JWT令牌,但SAML令牌通常是POST。我敢打赌,服务器也可以配置为发布jwt令牌。