单点注销第二个请求在ADFS中失败

时间:2016-03-01 00:30:38

标签: spring-security saml-2.0 adfs

当我通过ADFS将Auth0到SSO用于Spring安全应用程序时,我已经设置了一直使用saml。所以,它看起来像这样:

Auth0 ----> ADFS ----> SpringSecurity App.

我控制了Auth0,但它正在模拟与我们的ADFS服务器集成的第三方。

这很好用。

要进行注销,我最不想破坏SpringSecurity App和ADFS应用程序上的会话。当我第一次调用logout时,SAML注销请求将传递给ADFS。然后ADFS将Logout请求传递给Auth0,并在其结束。这会破坏会话。

但是,如果在没有关闭浏览器的情况下再次登录,然后注销,ADFS会使用urn:oasis:names:tc:SAML:2.0:status:Requester拒绝注销请求,这意味着它不喜欢我的请求。

我已经能够将其缩小到这样一个事实,即有一个SAMLLogout cookie,其中包含我的ADFS服务器域。这似乎是在注销退回到Auth0时设置的,但从未被删除。当该cookie存在时调用注销会导致错误。当我删除那个cookie时,我可以成功注销(因为它会破坏ADFS会话并向Auth0发送注销请求)。 Cookie的有效期为Session,因此关闭并打开浏览器也可以。

我可以发布令牌请求和响应,但我不认为它与令牌本身有关。它们都已正确签名,并且ADFS在执行注销时不会报告任何错误。

我不一定需要ADFS调用Auth0(或任何IdP)来销毁该会话,我只需要它来销毁它自己的会话。

2 个答案:

答案 0 :(得分:0)

请使用“unset”代替使用destroy,以避免在注销代码方面出现进一步的问题。我不知道为什么,但有时候“破坏”导致注销按钮问题。

答案 1 :(得分:0)

我们想出了以下解决方案: 我们注意到adfs / ls / idpinitiatedsignon.aspx页面上有“从您访问过的所有站点中退出”。无论您登录多少次并从不同选项卡注销,都会终止身份验证Cookie的选项。 我们创建了idpinitiatedsignon.aspx和idpinitiatedsignon.aspx.cs的重复副本并重命名它们(例如logoutpage.aspx)。 我们添加了SingleLogout();在idpinitiatedsignon.aspx.cs的Page_Init的末尾,所以它读取: protected void Page_Init(object sender,EventArgs e)     {         string rpIdentity = Context.Request.QueryString [RpIdentityQueryParameter];

    //
    // If the query string specified a certain relying party, sign in to that relying party.
    //
    if ( !String.IsNullOrEmpty( rpIdentity ) )
    {
        string decodedIdentity = Server.UrlDecode( rpIdentity );

        if ( decodedIdentity == IdpAsRpIdentifier )
        {
            decodedIdentity = String.Empty;
        }

        SignIn( rpIdentity, new SignOnRequestParameters() );
    }
    else
    {
        PopulateConditionalVisibilityControls();

        RelyingPartyDropDownList.DataSource = RelyingParties;
        RelyingPartyDropDownList.DataBind();

        UpdateText();
    }
SingleLogout();
}

然后我们将此新页面示例logoutpage.aspx引用为注销URL。 我希望这将为在ADFS v2上面临此SAML注销问题的其他人节省一些研究时间。