0

バックチャネル ログアウトを実装しました。URL はすべてのクライアントを呼び出していますが、すべてのクライアントからのサインアウトではありません。

シナリオ

  1. クライアント A ログイン
  2. クライアント B ログイン
  3. クライアント A から [ログアウト] ボタンをクリックし、ID サーバーのログアウト ページにリダイレクトします。
  4. client-B に対してバックチャネル ログアウト URL が呼び出される
  5. client-A に対してバックチャネル ログアウト URL が呼び出される
  6. ID サーバーを確認します --> ユーザーはすでにログアウトしています
  7. Client-A の URL を入力し、ログインのために Identity Server にリダイレクトします
  8. 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サーバーにリダイレクトする必要があります

4

1 に答える 1