1

我在不同的域上有两个站点。我正在使用 Thinktecture IdentityModel 实现 SSO。

用户登录到站点 A。在某些时候,他们单击链接将他们带到站点 B。站点 A 使用 JWT 令牌将用户重定向到站点 B/Login.aspx?token=<token>。然后站点 B 通过调用站点 A 上的 API 对用户进行身份验证来验证令牌。如果通过身份验证,用户将自动登录到站点 B。

默认情况下,Thinktecture 令牌持续 10 小时,无法杀死令牌(据我所知)。如果用户退出站点,令牌仍然有效。我可以查看浏览器历史记录并获取“Login.aspx?token=< token >” url 并自动重新登录。有没有办法在用户注销时杀死所有用户令牌?令牌不应该作为查询字符串的一部分传递吗?防止重放攻击的最佳方法是什么?

4

2 回答 2

1

正如@leastprivilege 对您的问题所评论的那样,只需将两个站点定义为信任相同 IDP 的 RP(依赖方),您就可以轻松地为两个站点实现 SSO。这当然会简化您的身份验证解决方案架构。

话虽如此,使用 WS-Fed 的被动身份验证仍然容易受到重放攻击。尽管令牌已发布到您的站点,但在浏览器上点击几次“返回”(即使在退出后)也会将令牌重新发布到您的站点,并使用户重新登录。

幸运的是,WIF 有办法减轻这种攻击。通过配置:

    <identityConfiguration>
     .......
 <tokenReplayDetection enabled="true" />
     .....
    </identityConfiguration>

然后,Wif 将使用过的令牌缓存在服务器上,并确保它只使用一次。(如果检测到重放攻击,则会引发适当的异常SecurityTokenReplayDetectedException)。

这个缓存当然不会在进程回收中存活下来,并且在网络农场场景中是不够的。如果您还想在这些场景中减轻这种攻击,您将需要某种分布式和持久缓存。

我实现了一个作为对 Thinktecture.IdentityModel 的贡献,您可以查看并使用它。

于 2014-01-15T13:45:00.000 回答
0

听起来发布令牌应该可以解决问题,至少在您描述的这个最明显的场景中。没有使用过 JWT 令牌,但通常会发布 SAML 令牌。我敢打赌,服务器也可以配置为发布 jwt 令牌。

于 2013-11-25T20:23:04.850 回答