web-dev-qa-db-ja.com

IdentityServer4 PostLogoutRedirectUri

これがどのように使用されるのか混乱しています。

私が見たほとんどの例では、「/ signout-callback-oidc」として指定されています。これは、プロセスでOIDCミドルウェアを使用していることを示しているようです。特定のクライアントページに戻りたい場合はどうすればよいですか?

IdentityServerのAutomaticRedirectAfterSignOutのAccountOptions.csプロパティをtrueに設定すると、自動リダイレクトが機能しません。さらに、ログアウト中に、クライアントのPostLogoutRedirectUriを受け取りません。

それで、そのリンクはOIDCミドルウェアに行くはずですか、それともクライアントにリダイレクトするために使用できますか?

8
JakeJ

クライアントは、クライアントが開始したサインアウトフローの一部として、これらのURIのいずれかにコールバックを要求するように構成する必要があります。

IS4クライアントは、サインインとサインアウトの両方で許可されるリダイレクトURIのリストを使用して構成できます。これは、/signout-callback-oidcが表示されている場所だと思います-私が正しく覚えている場合は、ドキュメントまたはクイックスタートコードのいずれかです。それを使用しますが、その特定のURI名について特別なことは何もありません。 (私が知る限り、これはOIDC標準でも、「よく知られた」名前でも、そのような性質のものでもありません。)

パズルの欠けている部分は、クライアントアプリケーションでOIDCを構成することです。クライアント側のアプリケーションの種類については触れませんでしたが、ASP.NET Coreでは、SignedOutCallbackPathサービスのAddOpenIdConnectというオプションです。

services.AddOpenIdConnect("oidc", options =>
{
    options.SignInScheme = "Cookies";
    options.Authority = appConfig["OidcAuthority"];
    options.ClientId = appConfig["OidcClientId"];
    options.ClientSecret = appConfig["OidcClientSecret"];
    // etc

    options.SignedOutCallbackPath = "/jake-says-goodbye";
});

これにより、OIDC実装は、そのリダイレクトURIを識別するプロパティをサインアウト要求に追加します。ドキュメント here で簡単に説明されているように、アプリケーションが適切に識別される限り、および/jake-says-goodbyeがIS4側で承認されたログアウト後リダイレクトURIの1つである限り、期待しているコールバックを取得します。

(私が見たgithubの質問に基づいて、JSベースのSPAクライアントアプリの管理は、MVCがサーバーを管理するために舞台裏で行うどんな有益なことよりも難しいように思えるので、私は特に「適切な」識別について言及します-サーバーとOIDCの相互作用です。まだIS4でSPAクライアントを実装する必要がなかったので、話をすることはできません。

6
McGuireV10

問題は、PostLogoutRedirectUriがIdentityServer側でnullとして表示されないようにするために非常に特定のパラメーターを設定する必要があり、オプションのいずれかをテストすると、それを設定するための多数の方法を実行する必要があることです。それでもnullになります。 IdentityServer4で古いクライアントを使用しているため(.NET 4.x webappsがIdentityServer4を介して認証できるようにするために、これらのプロジェクトで.NET Coreを簡単に使用できません-幸いにもIdentityServer4は古いクライアントコードと互換性があります)、アクションサインアウトをトリガーすることには2つの関連するものがあります(そして、.NET 4.xのMVCで動作しないコードの例のTONが見つかります)。

このサンプルgithubリポジトリ(IdentityServer3 MVC Owinサンプルクライアント)でsignout()メソッドを使用します。 https://github.com/IdentityServer/IdentityServer3.Samples/blob/master/source/Clients/MVC%20OWIN% 20Client/Controllers/HomeController.cs ビューのボタンからそのアクションをトリガーできます。

これを行うと、クライアントのOwinミドルウェアによってインターセプトされます。 https://github.com/IdentityServer/IdentityServer3/issues/2687#issuecomment-194739035 保存されたメッセージビットを使用しませんでした。また、IdentityServer4のLogoutRequestモデルが同じセグメントの次の行で削除されないように、PostLogoutRedirectUriパラメーターを追加しました。

n.ProtocolMessage.PostLogoutRedirectUri = " http:// myredirectaddress/ActionToDoOnceReturned ";上記がIdentityServer側のクライアント設定のクライアントのPostLogoutRedirectUriと一致することを確認する必要があります。そうしないと、再びnullになり、他のすべてのパラメーターの中でそれを逃してしまいます。たとえば、PostLogoutRedirectUriを設定する次のメソッドは機能しません。n.ProtocolMessage.SetParameter( "PostLogoutRedirectURI"、 "some URL"); n.ProtocolMessage.SetParameter( "PostLogoutUri"、 "another URL"); n.ProtocolMessage.SetParameter( "PostLogoutRedirectUri"、 "IdentityServer4によって無視される別のURL");

そこから、PostLogoutRedirectUriがnullでなくなったため、レースに出かけます。さらにいくつかの考慮事項があります。IdentityServerコントローラーフォルダーのAccountOptionsを確認してください。そこで、AutomaticRedirectAfterSignoutをtrueに設定しました(これはIdSrvの最終ログアウトページでJavaScriptによって使用されます-設定されている場合、スクリプトはPostLogoutRedirectUriを使用してユーザーをクライアントに転送します)。ログアウト確認プロンプトを表示するオプションもあります。実際に表示したい場合は、OwinでIDトークンのヒントを設定しないようにしてください(PostLogoutRedirectUriを設定した場所のすぐ隣/サインアウトリクエストによってトリガーされる部分) )。これら2つのことを行うと、AccountServices.BuildLogoutViewModelは、AccountController.logout()メソッドによって呼び出されたときにユーザーにプロンプ​​トを返します。その部分に関する私の他の質問への回答をありがとうaaronR:
IdentityServer4 logout (idトークンヒントは、システムへの嫌がらせやユーザーのサインアウトを試みている悪意のある人物ではなく、サインアウト要求が承認されたことをIdentityServerに通知します。IdSrvは、ユーザーに確認を求めます提供されていない)。

最後に、ログアウトのIdentityServer側で何が起こっているのか、そして同じメソッドが繰り返しトリガーされる理由に混乱している場合:

初めてクライアントのOwinミドルウェア(Signout()アクションの後にトリガーされる上記のコード)から呼び出されます。

AccountServiceを使用してビューモデルを作成し、ログアウトの確認のためにユーザーに戻ります。

ユーザーがそのページで[はい]をクリックすると、再びトリガーされます。

アカウントサービスメソッドをもう一度通過します。今回は、ログアウトの確認をfalseに表示するようにブール値を設定します。

2番目のログアウトメソッドを呼び出します。これは、渡されるビューモデルを使用するメソッドです。

これにより、外部IDプロバイダーのサインアウトがトリガーされます。

外部IDプロバイダーは制御をログアウトに戻し、その結果、再び呼び出され、2番目のログアウトメソッドが再度呼び出されます。

最後に、ユーザーをIdentityServerのログアウトページに戻します。 PostLogoutRedirectUriが設定されていて、AutomaticRedirectAfterSignOutがtrueの場合、そのページには、ユーザーのブラウザを自動的に転送するJavaScriptがあります。

一度にデバッグする2つのプロジェクトと、リダイレクトを設定するこれらすべての可能な方法(nullにならないようにクライアント/サーバー側の構成と一致する必要がある)があるため、混乱しやすくなります。

3
JakeJ

概観

IdentityServerを設定する場合(別のアプリケーションであると想定)、アクセスするクライアントの構成には、2つのパラメーターRedirectUrisPostLogoutRedirectUrisがあります。これらはIdentityServerシステムに対するユーザーのログインまたはログアウト後に何が起こるかに対応します。

クライアントアプリにはおそらく独自のCookie(またはJWTトークン、またはユーザーセッションを維持するために使用しているもの)があるため、IdentityServerがいつログインを処理し、ユーザーデータを利用可能にしたかを知る必要があります。

デフォルトのASP.NET OpenID Connectミドルウェアは、yourapp.com/signin-oidcおよびyourapp.com/signout-callback-oidc IdentityServerからのログイン/ログアウトハンドオフをインターセプトして処理するエンドポイント。これらのエンドポイントはOpenIDプロトコルとは何の関係もなく、独自の認証ハンドラーがある場合は任意に設定できますが、デフォルトのミドルウェアを使用している場合は、IdentityServer構成でそれらに設定する必要があります。

構成オプション

ただし、ユーザーをリダイレクトしたい場合after OpenID Connectのログアウトが完了した場合は、このためのオプションがあります。

services.AddOpenIdConnect(options => 
{
     // your other options...

     options.SignedOutRedirectUri = "/some-page-after-oidc-logout";
});

https://docs.Microsoft.com/en-us/dotnet/api/Microsoft.aspnetcore.authentication.openidconnect.openidconnectoptions.signedoutredirecturi

2
Mani Gandham

PostLogoutRedirectUri値がnullの問題を解決した方法を共有したいと思います。 mvcクライアント側にSignInScheme値を追加するまで、ログアウトコンテキストに常にnullのPostLogoutRedirectUri値がありました。 MVCクライアント側の認証のこれらの設定は私にとってはうまくいきます:

_var authenticationBuilder = services.AddAuthentication(options =>
{
    options.DefaultScheme = "Cookies";
    options.DefaultChallengeScheme = "oidc";
});

authenticationBuilder.AddCookie(options =>
{
    options.ExpireTimeSpan = TimeSpan.FromMinutes(60);
    options.Cookie.Name = "identity_server_mvc";
});

authenticationBuilder.AddOpenIdConnect("oidc", options =>
{
    options.Authority = "{IDENTITY_SERVER_URL}";
    options.ClientId = "mvc";
    options.SaveTokens = true;
    options.SignInScheme = "Cookies";
});
_

Identity Server側のクライアント構成にPostLogoutRedirectUri値を追加したことを確認する必要もあります。

_new Client
{
    ClientId = "mvc",
    AllowedGrantTypes = GrantTypes.Implicit,

    RedirectUris           = { "{CLIENT_URL}/signin-oidc" },
    PostLogoutRedirectUris = { "{CLIENT_URL}/signout-callback-oidc" },

    AllowedScopes =
    {
        IdentityServerConstants.StandardScopes.OpenId,
        IdentityServerConstants.StandardScopes.Profile
    }
}
_

最後にもう1つ重要な点があります。このため、Identity Server側でlogoutId値がnullでした。ログアウトプロセスを開始するには、最初にmvcクライアント側でSignOut("Cookies", "oidc")を呼び出す必要があります。私のHomeControllerのエンドポイントの例:

_public IActionResult Logout()
{
    return SignOut("Cookies", "oidc");
}
_

幸運を!

0
tscissors