Amazon web services 多租户web应用程序上的AWS Cognito用户池

Amazon web services 多租户web应用程序上的AWS Cognito用户池,amazon-web-services,asp.net-core,amazon-cognito,multi-tenant,Amazon Web Services,Asp.net Core,Amazon Cognito,Multi Tenant,我们有一个.net核心MVC web应用程序,可供多个客户使用。每个客户将有多个用户 我们打算使用AWS Cognito进行用户身份验证,阅读本文,我发现每个客户的用户池是推荐的途径之一。这对于我们的用例很有效,因为客户A可能需要一个用户名为“Bob”的用户,而客户B可能需要另一个用户名为“Bob”的用户 我所读到的一切都表明这应该是可能的,但问题是: 在.net core中,我必须指定启动时特定于特定应用程序池的一些详细信息: .AddOpenIdConnect

我们有一个.net核心MVC web应用程序,可供多个客户使用。每个客户将有多个用户

我们打算使用AWS Cognito进行用户身份验证,阅读本文,我发现每个客户的用户池是推荐的途径之一。这对于我们的用例很有效,因为客户A可能需要一个用户名为“Bob”的用户,而客户B可能需要另一个用户名为“Bob”的用户

我所读到的一切都表明这应该是可能的,但问题是:

在.net core中,我必须指定启动时特定于特定应用程序池的一些详细信息:

                .AddOpenIdConnect(async options =>
            {
                options.ResponseType = OpenIdConnectResponseType.Code;

                options.ConfigurationManager = new ConfigurationManager<OpenIdConnectConfiguration>(
                                                services.BuildServiceProvider().GetService<IOpenIdDiscovery>().OpenIdConfigurationUrl(),
                                                new OpenIdConnectConfigurationRetriever(),
                                                services.BuildServiceProvider().GetService<System.Net.Http.HttpClient>());

                options.Authority = Configuration["OpenIdAuthority"];
                options.ClientId = Configuration["AuthCodeClientId"];
                options.ClientSecret = Configuration["AuthCodeClientSecret"];
.AddOpenIdConnect(异步选项=>
{
options.ResponseType=OpenIdConnectResponseType.Code;
options.ConfigurationManager=新建ConfigurationManager(
services.BuildServiceProvider().GetService().OpenIdConfigurationUrl(),
新的OpenIdConnectConfigurationRetriever(),
services.BuildServiceProvider().GetService());
options.Authority=Configuration[“OpenIdAuthority”];
options.ClientId=配置[“AuthCodeClientId”];
options.ClientSecret=配置[“AuthCodeClientSecret”];
如何让应用程序使用多线程池

为了详细说明上述情况,我认为理想的解决方案是:

1) 我们将用户定向到其用户池的特定登录URL。 2) 登录后,用户被重定向到中心站点。
3) 我们以某种方式检测他们通过哪个用户池进行身份验证,并相应地为会话设置ClientId和ClientSecret。

如果我理解正确,关键的挑战是识别与身份验证用户关联的Cognito用户池。要解决Cognito颁发的ID令牌包括识别用户Po的iss声明ol

这里有更多的细节


本周我不得不解决一个类似的问题。显然.NET Core不支持这种开箱即用的方法,因为在处理基于GUI的网站时,它可能会提出一些关于身份验证挑战的棘手问题:

然而,我是在API服务器的上下文中解决这个问题的,并且很容易做出一些基本假设

我最终通过实现自己的
JwtBearerHandler
类解决了这个问题,该类与.NET核心类基本相同,但根据HTTP请求中的信息动态重新配置
JwtBearerOptions
。最相关的更改可以在这里找到:

基本上,解决方案的要点是在
JwtBearerHandler
中从请求中提取一个标识符,然后根据请求传入时存储在数据库中的内容,在
JwtBearerOptions
上重新配置
受众
权限这项请求似乎很有效


我链接的整个repo是我为让Cognito auth处理多个用户池而进行的概念验证,因此可能值得花一些时间来阅读。它非常混乱,包括我不需要替换的类。核心更改在
CognitoUserPoolResolver
DSJWTBealerHandler
DSJw中t BearOptions

目前,我更关心的是如何实际配置.net core以使用不同的用户池(假设您知道它应该是什么)。我所能找到的一切都允许您在应用程序启动时设置用户池,但之后不必更改。