【问题标题】:AWS Cognito user pools on multi-tenant web app多租户 Web 应用程序上的 AWS Cognito 用户池
【发布时间】:2019-06-21 17:01:27
【问题描述】:

我们有一个可供多个客户使用的 .net Core MVC Web 应用程序。每个客户将有多个用户。

我们打算使用 AWS Cognito 进行用户身份验证并阅读此内容,我发现每个客户的用户池是推荐的路线之一。这适用于我们的用例,因为客户 A 可能想要一个用户名为“Bob”的用户,而客户 B 可能想要另一个用户名为“Bob”的用户。

我读过的所有内容都表明这应该是可能的,但问题是:

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

                .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。

【问题讨论】:

    标签: amazon-web-services asp.net-core amazon-cognito multi-tenant


    【解决方案1】:

    这周我不得不解决一个类似的问题。显然 .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 auth 与多个用户池一起工作而进行的概念验证,因此可能值得花一些时间阅读。它非常混乱,包括我不需要替换的类。核心更改在CognitoUserPoolResolverDSJwtBearerHandlerDSJwtBearerOptions

    【讨论】:

      【解决方案2】:

      如果我理解正确,关键挑战是识别与经过身份验证的用户关联的 Cognito 用户池。为了解决 Cognito 发行的 ID Token 包含一个标识用户池的 iss 声明。

      这里有更多细节,

      https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html

      【讨论】:

      • 目前我更关心的是您如何实际配置 .net 核心以使用不同的用户池(假设您知道它应该是什么)。我能找到的所有内容都允许您在应用启动时设置用户池,但之后不要更改它。
      猜你喜欢
      • 2018-03-25
      • 2021-05-14
      • 2018-03-08
      • 1970-01-01
      • 2012-07-24
      • 2020-06-14
      • 2016-06-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多