1

设想 -

假设我有一个网站 - www.example.com。我想为不同的客户贴上白色标签。因此,转到 example.customer1.com 应该显示 www.example.com 并带有一些自定义项,例如不同的徽标、名称等。我选择通过 CNAME 和过滤器来实现此功能,此设置目前运行良好。

一项要求是用户帐户应在所有客户站点之间共享。所以 example.customer1.com 上的帐户应该在 www.example.com 上有效

鉴于登录页面应该是 https 并且客户不会向我提供他们的 SSL 证书和私钥,我选择通过从http://example.customer1.com重定向到https://www.example来执行登录.com/login?custId=XXX

在 www.example.com 上成功登录后,我想将用户重定向回 example.customer1.com - 但是这两个上的会话不同,所以我丢失了会话信息,并且用户在重定向后没有登录.

问题 -

为了解决这个问题,我正在考虑将用户 ID(或一些可以识别用户的令牌)从 https//example.com/login 请求传递到重定向 url http//example.customer1.com/page 然后有白标站点将用户信息加载到其会话中。

恐怕这是不安全的,因为从 https 到 http 的转换带有一些识别信息,并且想知道可以采取哪些更好的方法来安全地解决这个问题?

谢谢!

4

1 回答 1

0

一些想法:

  1. 单点登录(SSO):使用集中的 IdentityProvider(IDP)/ServiceProvider(SP)联合身份验证机制,我们首先通过在 https 中共享客户端证书来建立客户端和 IDP 之间的信任。Spring security 对 SAML 或 OAuth 请求/响应样式有很好的支持。

    请参阅Spring SAML 现场演示,该应用程序在 http 上,并通过 https 上的 SSOCircle 进行身份验证,并使用用户信息重定向回 http。是的,建议使用 https 来确保消息完整性以避免重放攻击。

  2. 如果您打算直接从 https 应用程序返回令牌,请确保该应用程序在每次登录时生成一个唯一的随机 id,并在某些数据库中加密和持久化令牌并将其返回给 http 应用程序或设置浏览器 cookie,然后使用 spring具有身份验证过滤器的 http 应用程序的安全性,并且仅通过检查请求是否具有 cookie 或令牌并使用其持久化的数据库解密/验证该令牌以避免匿名访问并配置 spring 安全会话管理以使并发会话无效来允许访问。这只是为了让暴力攻击更难,因为我们有一个唯一的随机 ID、加密、持久性、浏览器 cookie、阻塞并发会话。但是如果cookie被捕获或token被捕获(要捕获,攻击者需要访问受害者的浏览器获取cookie,他可以通过网络钓鱼攻击或任何其他方式进行),但攻击者仍然可以像用户一样重播请求,因为您不在 https 上。但即使是攻击者重播,因为你有弹簧安全会话管理,它会阻止攻击者会话。但是如果用户注销或用户会话超时,现在攻击者可以使用相同的 cookie/令牌重播。为避免这种情况,您的 http 应用程序应处理会话无效(将 db 中的令牌标记为无效,在该 https 应用程序中调用用户注销以全局注销用户),因此如果攻击者尝试他应该失败并重定向到 https 登录。现在攻击者可以使用相同的 cookie/令牌重播。为避免这种情况,您的 http 应用程序应处理会话无效(将 db 中的令牌标记为无效,在该 https 应用程序中调用用户注销以全局注销用户),因此如果攻击者尝试他应该失败并重定向到 https 登录。现在攻击者可以使用相同的 cookie/令牌重播。为避免这种情况,您的 http 应用程序应处理会话无效(将 db 中的令牌标记为无效,在该 https 应用程序中调用用户注销以全局注销用户),因此如果攻击者尝试他应该失败并重定向到 https 登录。
于 2015-09-10T08:21:20.393 回答