我正在开发一个自己动手的联邦实现。有两个RP。 RP之间的SSO不起作用(错误地)。我怀疑它与STS正在创建的cookie有关。 STS正在为自己编写一个fedauth cookie。根据我的理解,它应该是编写表单身份验证cookie吗?
当从另一个RP第二次到达STS时,我可以在ClaimsPrincipal中看到IsAuthenticated = True,但是提示用户登录而不是自动重定向回RP。
值得注意的是SSO之前确实工作过,自动重定向和所有,但负载均衡器上的RP无法共享cookie,因为它使用机器密钥(并且没有粘性会话)。我通过实现使用证书的自定义SessionSecurityTokenHandler(下面的代码)来解决这个问题。正是在这一点上,STS开始编写FedAuth cookie并且SSO开始失败。
使用以下命令编写sts令牌:
FederatedAuthentication.SessionAuthenticationModule.WriteSessionTokenToCookie(token);
令牌处理程序:
var sessionTransforms = new List<CookieTransform>(new CookieTransform[]
{
new DeflateCookieTransform(),
new RsaEncryptionCookieTransform(federationConfiguration.ServiceCertificate),
new RsaSignatureCookieTransform(federationConfiguration.ServiceCertificate)
});
var sessionHandler = new SessionSecurityTokenHandler(sessionTransforms.AsReadOnly());
federationConfiguration.IdentityConfiguration.SecurityTokenHandlers.AddOrReplace(sessionHandler);
答案 0 :(得分:0)
STS编写自己的cookie。它将安全令牌POST到您的应用程序。您的应用程序通常会通过编写会话身份验证cookie来响应,该cookie将在其到期之前使用(然后它将返回到STS)
如果您在Web场中工作,那么使用WIF配置可以为此提供现成的支持:
当然,Web场中的计算机应该共享相同的计算机密钥。你当然可以使用自己的机制,但很少有意义。
接下来,每个RP应该编写自己的“会话”cookie,以证明您的身份验证。如果两个RP位于同一个域中,那么他们应该使用不同的cookie名称。