我们有一个 Web 应用程序,它由两部分(除其他外)组成:一个用 Java 编写的“shell”,在 Jetty 中运行,通过 Waffle 使用 Windows 身份验证,它显示了一个用 ASP.NET 编写的“组件”,使用 Windows 身份验证在 IIS 中运行。这两个部分都来自同一主机,但(当然)来自不同的端口。
就目前而言,用户首先必须登录到 shell,然后当组件加载时,用户必须再次登录。 我们想摆脱第二个登录步骤。
从我所看到和阅读的内容来看,例如关于基于声明的身份验证和 OAuth,其标准模式如下:
- 登录到 shell 后,shell 使用用户的 Windows 帐户名构造一个“令牌”,并将其发送回浏览器。
- 该组件不使用 Windows 身份验证,而是由浏览器向其发送令牌。
- 该组件验证它是否信任令牌,并使用来自该令牌的身份。
(在我们的例子中,最简单的技术是将令牌放在 cookie 中,因为 shell 和组件都运行在同一台服务器上,并且HTTP cookie 不是特定于端口的,所以浏览器会自动将 shell 的令牌发送给组件。)
现在我看到了几种构造和验证令牌的方法,例如:
- (a) 令牌包含 Windows 帐户名称,使用硬编码到外壳和组件中的对称密钥加密,或者在安装时或启动时生成并同意。
- (b) 令牌包含 Windows 帐户名称,使用私钥签名,并使用相应的公钥进行验证。此密钥对在安装时生成。
- (c) 令牌包含一个 GUID,组件的服务器端调用 shell 的服务器端来验证其有效性并获取 Windows 帐户名。
我认为我更喜欢 (b),因为 (a) 似乎过于“硬编码”,并且 (c) 更有可能产生缩放问题。此外,我们已经在 shell 中以 SSL 服务器证书的形式存在一个私钥/公钥对,该证书受组件信任。
我对 (b) 的主要担忧是令牌将包含 (X.509?) 签名,这意味着令牌可能会变得相当大。(会吗?)另外,我(还)不熟悉在 Java 中创建签名并在 .NET 中验证它的技术。
我的问题:这里使用的标准/推荐模式是什么?我忽略了哪些替代方案?有没有我们可以在这里使用的标准协议?