首页 > 解决方案 > Identity4 反向通道注销 SSO/SLO 不适用于所有客户端

问题描述

我已经实现了反向通道注销并且 URL 正在调用所有客户端,但它不是从所有客户端注销

设想

  1. 客户端-A 登录
  2. 客户端-B登录
  3. 单击 Client-A 的注销按钮,重定向到身份服务器注销页面
  4. 为客户端 B 调用反向通道注销 URL
  5. 为客户端 A 调用反向通道注销 URL
  6. 检查身份服务器 --> 用户已经注销
  7. 输入 Client-A 的 URL,重定向到 Identity Server 进行登录
  8. 输入Client-B的URL,我可以查看(假设已经重定向到身份服务器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();
        }

我想实现,如果从客户端注销它,它应该重定向到身份服务器进行登录

标签: asp.net-coreidentityserver4single-logout

解决方案


您客户端中的注销代码不应返回任何内容,因为这会干扰 SignOutAsync 在内部为您创建的响应。

示例注销可能如下所示:

    /// <summary>
    /// Do the logout
    /// </summary>
    /// <returns></returns>
    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task Logout()
    {
        await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
        await HttpContext.SignOutAsync(OpenIdConnectDefaults.AuthenticationScheme);

        //Important, this method should never return anything.
    }

推荐阅读