我正在基于 Thinktecture 代码实现我自己的身份提供者。这是 Azure ACS 在使用单点注销功能时的一种奇怪行为,它对于 google/live 和我自己的身份提供者有所不同。
退出 URL(领域实际上与站点名称相同):
mysite.accesscontrol.windows.net/v2/wsfederation?wa=wsignout1.0&wreply=http%3a%2f%2flocalhost%2fAdministration.Frontend.Web%2f&wtrealm=http%3a%2f%2flocalhost%2fAdministration.Frontend.Web%2f
这是注销的伪代码:
//clear FedAuth cookies
FormsAuthentication.SignOut();
FederatedAuthentication.WSFederationAuthenticationModule.SignOut(true);
//call Single SignOut
var signoutRequestMessage = new SignOutRequestMessage(new Uri(signOutUrl));
return Redirect(signoutRequestMessage.WriteQueryString());
这是示例流程(我正在使用隐私浏览和 Fiddler 来查看所有内容):
1)我正在使用谷歌帐户登录我的应用程序。
2)单击注销,结果我在 ACS 上获得一个带有此代码的页面:
function on_completion()
{window.location = 'http://localhost/Administration.Frontend.Web/';}
<iframe src="https://www.google.com/accounts/Logout" style="visibility: hidden"">/iframe>
<iframe src="http://localhost/Administration.Frontend.Web/?wa=wsignoutcleanup1.0" style="visibility: hidden"></iframe>
结果:我从我的应用程序和谷歌中注销。
3)登录到我的身份提供者,单击注销,重定向到 ACS 上与上一步相同的 URL,但现在我得到 302 结果并重定向到
https://localhost/IdentityProvider/issue/wsfed?wa=wsignout1.0&wreply=https%3a%2f%2fmysite.accesscontrol.windows.net%2fv2%2fwsfederation%3fredirectUrl%3dhttp%3a%2f%2flocalhost%2fAdministration.Frontend.Web%2f
结果:我已从我的应用程序和身份提供者中注销。
4)再次尝试使用google,输入凭据成功登录,但如果失败则注销。我已从应用程序中注销,但未从谷歌登录。而且我还看到我没有使用 iframe 获取页面,而是 ACS 再次尝试将我重定向到
https://localhost/IdentityProvider/issue/wsfed?wa=wsignout1.0
(然后回到 mysite.accesscontrol.windows.net 最后回到我的应用程序)
两个主要问题:
- 为什么调用 ACS 注销会给我 iframe 页面,其中包含用于 google/live 的额外 wa=wsignoutcleanup1.0 但 302 重定向到我的身份提供者,我可能会错过 FederationMetadata.xml 中的某些内容吗?
- 看起来第 3 步之后的 ACS 不明白我已成功从身份提供商注销,并且从此刻开始一次又一次地尝试这样做,如何告诉他们停止它?