我们有一个Web应用程序,它由两部分组成(其中包括):a' shell'使用通过Waffle进行Windows身份验证在Jetty中运行的Java编写,它显示了一个'组件'使用Windows身份验证在IIS中运行的IIS中编写。这两个部分都来自同一台主机,但(当然)来自不同的端口。
目前,用户首先必须登录shell,然后在加载组件时,用户必须再次登录。 我们希望摆脱第二次登录步骤。
从我所看到和阅读的内容,例如:关于基于声明的身份验证和OAuth,其标准模式如下:
(在我们的例子中,最简单的方法是将令牌放在cookie中,因为shell和组件都在同一台服务器上运行,HTTP cookies are not port-specific,所以浏览器会自动发送shell的令牌组件。)
现在我看到了构建和验证令牌的几种方法,例如:
我认为我更喜欢(b),因为(a)似乎过于“硬编码”,而且(c)更有可能提出缩放问题。此外,我们已经在shell中以SSL服务器证书的形式建立了私钥/公钥对,该证书受组件信任。
我对(b)的主要关注是令牌将包含(X.509?)签名,这意味着令牌可能变得相当大。 (是吗?)另外,我还不熟悉在Java中创建签名并在.NET中验证它的技术。
我的问题:这里使用的标准/推荐模式是什么?我忽略了哪些替代方案?我们可以在这里使用标准协议吗?
答案 0 :(得分:1)
你走在正确的轨道上。
是的,我们的想法是让shell生成一个不能伪造的令牌(由shell以外的任何人/任何人生成),该令牌可以由组件验证。
你是对的,令牌可能变得非常大。它不会变得那么大,以至于不可行(即比浏览器可以处理的大),但它可能成为性能问题。
通常,任何接受具有任何缓存身份验证的HTTP流量的组件都将具有该缓存身份验证的首选格式。在您当前的实现中,在用户登录组件(步骤中的第二个签名)之后,组件将发出某种cookie,其中包含将为后续请求接受的标识凭据。所以最好的办法是让shell准确创建这些凭据。
如果不这样做,您可以使用您的选项(b)创建一个签名的认证表单,该组件可以验证的shell然后替换为其首选的身份验证凭据。