当我通过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)来销毁该会话,我只需要它来销毁它自己的会话。
答案 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注销问题的其他人节省一些研究时间。