Spring security ADFS中的单次注销第二次请求失败

Spring security ADFS中的单次注销第二次请求失败,spring-security,saml-2.0,adfs,Spring Security,Saml 2.0,Adfs,当我使用Auth0通过ADFS将SSO导入到Spring安全应用程序中时,我已经进行了设置,一直使用saml。所以,看起来是这样的: Auth0 ----> ADFS ----> SpringSecurity App. 我可以控制Auth0,但它模拟的是第三方,可以与我们的ADFS服务器集成 这个很好用 要注销,我只想破坏SpringSecurity应用程序和ADFS应用程序上的会话。当我第一次调用logout时,SAML注销请求被传递给ADFS。ADFS然后将注销请求传递给Aut

当我使用Auth0通过ADFS将SSO导入到Spring安全应用程序中时,我已经进行了设置,一直使用saml。所以,看起来是这样的:

Auth0 ----> ADFS ----> SpringSecurity App.
我可以控制Auth0,但它模拟的是第三方,可以与我们的ADFS服务器集成

这个很好用

要注销,我只想破坏SpringSecurity应用程序和ADFS应用程序上的会话。当我第一次调用logout时,SAML注销请求被传递给ADFS。ADFS然后将注销请求传递给Auth0,并在那里结束。这会破坏会话

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

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

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


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

请使用“unset”来避免与注销代码有关的进一步问题,而不要使用destroy。我不知道为什么,但有时“销毁”会导致注销按钮出现问题

我们提出了以下解决方案: 我们注意到,adfs/ls/idpinitiatedsignon.aspx页面具有“从您访问的所有站点注销”选项,无论您从不同选项卡登录和注销多少次,该选项都将终止身份验证cookie。 我们已经创建了idpinitiatedsignon.aspx和idpinitiatedsignon.aspx.cs的副本,并将其重命名(例如logoutpage.aspx)。 我们添加了SingleLogout();在idpinitiatedsignon.aspx.cs的页面_Init的末尾,其内容如下: 受保护的无效页_Init(对象发送方,事件参数e) { 字符串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注销问题的人节省一些研究时间。

对不起,我并不是说要调用“销毁”或“取消设置”,我是说更多的是Spring Security和ADFS的内置功能。您找到了解决方案吗?