自定义STS SSO失败

时间:2016-07-18 10:32:22

标签: single-sign-on wif sts-securitytokenservice

我正在开发一个自己动手的联邦实现。有两个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);

1 个答案:

答案 0 :(得分:0)

STS编写自己的cookie。它将安全令牌POST到您的应用程序。您的应用程序通常会通过编写会话身份验证cookie来响应,该cookie将在其到期之前使用(然后它将返回到STS)

如果您在Web场中工作,那么使用WIF配置可以为此提供现成的支持:         

当然,Web场中的计算机应该共享相同的计算机密钥。你当然可以使用自己的机制,但很少有意义。

接下来,每个RP应该编写自己的“会话”cookie,以证明您的身份验证。如果两个RP位于同一个域中,那么他们应该使用不同的cookie名称。