0

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&amp;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 つの主な質問:

  1. ACS ログアウトを呼び出すと、google/live の wa=wsignoutcleanup1.0 が追加された iframe ページが表示されるのに、ID プロバイダーに 302 リダイレクトされるのはなぜですか?
  2. ステップ 3 の後、ACS は ID プロバイダーから正常にログアウトしたことを理解していないようで、この瞬間から何度も何度もログアウトしようとしています。停止するように伝える方法は?
4

1 に答える 1

3

これがあなたがしなければならないことです。

まず、フェデレーション認証を使用する場合は、常に HTTPS を使用してください。単純な HTTP であるという理由だけで、プロトコル ネゴシエーションが失敗することがあります。ブラウザが安全でないトラフィックをブロックすることがありますが、これはサインアウト プロセスにとって重要です。したがって、常に HTTPS を使用してください。

ここで、必要なシングル サインアウトの形式を実装するには、さらに作業を行う必要があります。

サインアウト用の 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

SignOutRequestMessage を構築するためのパラメータとして使用しないでください。直接使用してくださいreturn Redirect(signOutUrl)

2 つの主要な場所でサインアウトを実装する必要があります。

最初の場所は、一般的な logOff アクション メソッドです (MVC を使用している場合) 既に持っているものに似ていますが、重要な変更があります。

FormsAuthentication.SignOut();
var signoutProtocolLocation = "https://[your_acs_namespace].accesscontrol.windows.net:443/v2/wsfederation?wa=wsignout1.0&wtrealm=[realm]&wreply=[reply]";
FederatedAuthentication.WSFederationAuthenticationModule.SignOut(signoutProtocolLocation);

ここでは、stringparamer` でオーバーロードを使用して、結果を ACS SSO の場所にリダイレクトしていることに注意してください。

まさにその場所で、JS といくつかの要素を含むACS SSO上記の HTML ページが生成されます。iframeそれらの1つは次のようになります。

<iframe src="http://localhost/Administration.Frontend.Web/?wa=wsignoutcleanup1.0" style="visibility: hidden"></iframe>

その特定の場所http://localhost/Administration.Frontend.Web/?wa=wsignoutcleanup1.0は、SSO を実装したコード内の 2 番目の場所です。このリクエストはログイン ページにリダイレクトしてはなりませんが、代わりに正しく処理して 200 または 301 レスポンスを返す必要があります (これは 200 を返します!)。簡単にするために、ここで使用されているコードのみを貼り付けます。

 if(Request.QueryString.AllKeys.Contains("wa")
                && Request.QueryString["wa"].Equals("wsignoutcleanup1.0"))
            {
                FederatedAuthentication.WSFederationAuthenticationModule.SignOut(true);
                return RedirectToAction("Index");
            }

アクションのリクエストの場合にのみ、SignOut(true)オーバーロードをtrueで呼び出すことが非常に重要です。wsignoutcleanupユーザーの一般的なログオフを行うときではありません。

上記のすべての変更を試して、問題が解決するかどうかお知らせください。

于 2013-05-15T10:53:29.823 に答える