多租户 Web 应用上的 AWS Cognito 用户池

4
我们有一个单一的 .net Core MVC 网站应用程序,将被多个客户使用。每个客户都会有多个用户。
我们打算使用 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"];

我该如何让应用程序使用多个用户池?

为了更详细地说明,最理想的解决方案可能是:

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

2个回答

3
本周我遇到了类似的问题。 显然,.NET Core不支持此功能,因为在处理基于GUI的网站时可能会引发一些棘手的授权挑战问题:https://github.com/aspnet/Security/issues/1847 但是,在API服务器上解决这个问题很容易,因为可以做出一些潜在的假设。
我最终通过实现自己的JwtBearerHandler类来解决它,该类与.NET Core类大致相同,但根据HTTP请求中的信息动态重新配置JwtBearerOptions。 最相关的更改可以在此处找到:https://github.com/tgittos/AmazonCognitoPrototype/blob/master/AmazonCognitoSpike/Auth/CognitoUserPoolResolver.cs 基本上,解决方案的要点是在JwtBearerHandler中从请求中获取标识符,并使用存储在数据库中的标识符重新配置JwtBearerOptions中的AudienceAuthority。 它不会对请求增加太多额外负担,而且看起来效果还不错。
我链接的整个repo是一个概念验证,我在其中处理多个用户池的Cognito授权,因此可能值得花一些时间阅读它。 它相当杂乱,并包括我不需要替换的类。 核心更改位于CognitoUserPoolResolverDSJwtBearerHandlerDSJwtBearerOptions中。

0

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接