.net-core - IdentityServer4 登录后重定向到不同的客户端
问题描述
我正在开始一个新项目并使用 IS4 进行身份验证。该应用程序将有一个分布在多个区域的客户端和 API。用户将为其配置文件分配一个区域,以便他们在登录后可以重定向到其区域 URL(可能由子域定义),如何实现?
例如,用户导航到https://example.com并被要求登录。在登录过程中,用户定义了一个区域,例如英国。用户已通过身份验证,现在我需要将他们重定向到将托管在https://uk.example.com上的客户端
解决方案
根据 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 。在这种情况下,您必须控制它们。
推荐阅读
- python - Django Restful 应用程序中 as_view() 中的 TypeError
- postman - 邮递员| 有没有办法在全局范围内设置一个函数以在所有集合中工作?
- ubuntu - 在 LiteSpeed 上运行的 Ubuntu 18.04 上的 GD 库中启用 WebP 支持
- javascript - Firebase - 如何获取有人在过去 x 天内发表评论的所有帖子
- reactjs - Webpack 开发服务器仅在 docker 上热重载
- html - 如何使用 sublime RegEx将 word1 替换为word1,将 word2替换为word2,将 n 替换为n ?
- python-3.x - 获取开机后的linux时间
- javascript - 使用模态 [Bootstrap] 在 Angular 中登录表单
- c++ - 使用递归时访问冲突读取位置?
- parsing - 符号表和类型检查