首页 > 解决方案 > IdentityServer4 登录后重定向到不同的客户端

问题描述

我正在开始一个新项目并使用 IS4 进行身份验证。该应用程序将有一个分布在多个区域的客户端和 API。用户将为其配置文件分配一个区域,以便他们在登录后可以重定向到其区域 URL(可能由子域定义),如何实现?

例如,用户导航到https://example.com并被要求登录。在登录过程中,用户定义了一个区域,例如英国。用户已通过身份验证,现在我需要将他们重定向到将托管在https://uk.example.com上的客户端

标签: .net-coreidentityserver4multi-tenantblazor-webassembly

解决方案


根据 OIdC 规范,身份提供者必​​须在交互式登录后将用户重定向到授权请求提供的有效 URL。但是,我看到至少有两个选项可以解决要求,而无需在身份方面进行任何更改。

两者都需要在主站点http://example.com
上进行一些工作。 您可以调整OnTicketReceived处理,以便根据某些声明而不是用户最初请求的路径重定向到本地站点。
这可能看起来像:

services.AddAuthentication().AddOpenIdConnect(options =>
{
  options.Events = new OpenIdConnectEvents
  {
    OnTicketReceived = ctx =>
    {
      var identity = context.Principal.Identity as ClaimsIdentity;
      var locale = identity?.Claims.
        FirstOrDefault(x => x.Type == JwtClaimTypes.Locale)?.Value??"en-GB";
      switch (locale)
      {
        case "ru-RU":
          ctx.ReturnUri = "http://ru.example.com"; 
          //or just example.ru, doesn't matter
          break;
        default:
          ctx.ReturnUri = "http://uk.example.com"; 
          break;
      }
      return Task.CompletedTask;
    }
  }
}

在这里,我们面临两种选择:

  • 将每个本地站点注册为单独的 OIdC 客户端,以便它们作为普通的 SSO 解决方案执行,甚至可以单独托管卫星站点。
  • 或者按照文档中的描述在所有本地站点之间共享 auth cookie 。在这种情况下,您必须控制它们。

推荐阅读