Thinktecture コードに基づいて独自の ID プロバイダーを実装しています。これは、シングル サインアウト機能を使用しているときの Azure ACS の奇妙な動作です。これは、google/live と独自の ID プロバイダーで異なります。
サインアウト用の 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) Google アカウントでアプリケーションにログインしています。
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>
結果: アプリケーションと Google からログアウトしました。
3) ID プロバイダーにログインし、[ログアウト] をクリックして、前の手順と同じ 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
結果: アプリケーションと ID プロバイダーからログアウトされました。
4) 再度 Google を使用して、資格情報を入力してログインに成功しますが、失敗した場合はログアウトします。アプリケーションからログアウトしましたが、Google からはログインしていません。また、iframe でページを取得できないことがわかりますが、代わりに ACS が再度リダイレクトしようとします。
https://localhost/IdentityProvider/issue/wsfed?wa=wsignout1.0
(そして、mysite.accesscontrol.windows.net に戻り、最後にアプリケーションに戻ります)
2 つの主な質問:
- ACS ログアウトを呼び出すと、google/live の wa=wsignoutcleanup1.0 が追加された iframe ページが表示されるのに、ID プロバイダーに 302 リダイレクトされるのはなぜですか?
- ステップ 3 の後、ACS は ID プロバイダーから正常にログアウトしたことを理解していないようで、この瞬間から何度も何度もログアウトしようとしています。停止するように伝える方法は?