バックチャネル ログアウトを実装しました。URL はすべてのクライアントを呼び出していますが、すべてのクライアントからのサインアウトではありません。
シナリオ
- クライアント A ログイン
- クライアント B ログイン
- クライアント A から [ログアウト] ボタンをクリックし、ID サーバーのログアウト ページにリダイレクトします。
- client-B に対してバックチャネル ログアウト URL が呼び出される
- client-A に対してバックチャネル ログアウト URL が呼び出される
- ID サーバーを確認します --> ユーザーはすでにログアウトしています
- Client-A の URL を入力し、ログインのために Identity Server にリダイレクトします
- Client-B の URL を入力してください。表示できます (ID サーバー bcos logout のログイン ページにリダイレクトされているはずです)。
ログアウトコード
public async Task<IActionResult> Logout()
{
Console.WriteLine("** MVC2 logout " + DateTime.Now.ToString("MM/dd/yyyy hh:mm:ss.fff tt"));
var client = _httpClientFactory.CreateClient("IDPClient");
var discoveryDocumentResponse = await client.GetDiscoveryDocumentAsync();
if (discoveryDocumentResponse.IsError)
{
throw new Exception(discoveryDocumentResponse.Error);
}
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
await HttpContext.SignOutAsync(OpenIdConnectDefaults.AuthenticationScheme);
return Redirect(discoveryDocumentResponse.EndSessionEndpoint);
}
BackChannel ログアウト コード
[HttpPost]
[AllowAnonymous]
public async Task<IActionResult> BackChannelLogout(string token)
{
Console.WriteLine("*********************** MVC1 --> BackChannelLogout " + DateTime.Now.ToString("MM/dd/yyyy hh:mm:ss.fff tt"));
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
await HttpContext.SignOutAsync(OpenIdConnectDefaults.AuthenticationScheme);
return NoContent();
}
クライアントからログアウトした場合、ログインのためにIDサーバーにリダイレクトする必要があります