2016-03-01 78 views
0

我使用saml一路通过ADFS将Auth0 SSO用于Spring安全应用程序时已设置好。因此,它看起来像这样:ADFS中的单一注销第二个请求失败

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

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

这工作正常。

要做注销,我最低限度希望销毁SpringSecurity应用程序和ADFS应用程序上的会话。当我第一次呼叫注销时,SAML注销请求会传递给ADFS。然后,ADFS将注销请求传递给Auth0,并在该处结束。这破坏了会话。但是,如果在没有关闭浏览器的情况下再次登录I SSO,然后注销,则ADFS会拒绝该登出请求,并显示urn:oasis:names:tc:SAML:2.0:status:Requester,这意味着它不喜欢我的请求。

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

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

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

回答

0

而不是使用摧毁善意使用“未设置”,以避免与注销代码有关的进一步问题。我不知道为什么,但有时候“摧毁”导致注销按钮方面的问题。

+0

对不起,我没有字面意思是一些调用“摧毁”或“未设置”,我的意思是更多的内置功能的Spring Security和ADFS – Ronnie76er

0

我们提出了以下解决方案: 我们注意到adfs/ls/idpinitiatedsignon.aspx页面有“从您访问的所有网站注销”。选项,无论您登录多少次并从不同的选项卡注销,都会终止身份验证Cookie。 我们创建了idpinitiatedsignon.aspx和idpinitiatedsignon.aspx.cs的重复副本并将它们重命名(例如logoutpage.aspx)。 我们添加了SingleLogout();在idpinitiatedsignon.aspx.cs的Page_Init的末尾,因此它读取: 保护无效Page_Init(对象发件人,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注销问题的其他人节省一些研究时间。