我正在开发一个将通过Internet进行通信的客户端/服务器应用程序。然而,服务器确实包含许多不同的服务,我只希望用户必须自己进行一次身份验证。
我想要归档的方案是拥有一个中央身份验证服务(通过首先验证服务器身份的加密连接),该身份验证用户并使用安全随机生成“足够大”的会话ID数字生成器。对于客户端从那时起需要访问的每个服务,它会创建一个新连接,对服务器进行身份验证(例如,使用证书和SSL),然后发送安全会话ID以证明它已针对给定会话进行了身份验证。该服务与集中式身份验证服务联系,以在响应任何其他请求之前验证会话是否有效和活动。
与对服务器签名的会话ID或身份验证cookie使用质询/响应相比,此方案是否有任何缺点?所有服务都是可信的,因此不需要使用连接的会话ID来模拟用户来防止服务(ab)。
答案 0 :(得分:1)
主要关注的是客户端负责在服务器之间将会话ID作为GET或POST请求进行传输,这使得该系统容易受到Session Fixation的攻击。通过这种描述,不清楚如何转移会话状态或谁负责这些信息。
我同意cookie应该是一个非常大的随机数,称为Cryptographic Nonce。此变量用作访问服务器端状态的密钥。在分布式会话的情况下,最简单的解决方案是使单个服务器或数据库负责维护所有域中的状态。这使事情变得更容易,因为用户可以同时处理多个域而无需担心竞争条件。当服务器需要设置或获取会话变量时,它们将向公共会话服务器发出请求。
要将用户从一台服务器转移到另一台服务器而不引入会话修复漏洞,请创建一次性使用“Transfer Id”,它也应该是一个加密Nonce。公共服务器知道用户已被标记为传输。客户端浏览器将此“传输ID”传输到新服务器,新服务器根据“传输ID”查找用户,然后新服务器重新生成要用于该域的会话ID。一种方法是使用传统的会话处理程序来确保每个服务器都具有唯一的会话ID。单个服务器可以存储状态信息,以将此会话ID与分布式系统上的特定用户状态相链接。