【问题标题】:DataProtection - Share machine key between multiple applicationsDataProtection - 在多个应用程序之间共享机器密钥
【发布时间】:2017-12-07 10:35:24
【问题描述】:

假设我们有两个 API,一个用于UserManagement,一个用于Auth

UserManagement API 负责初始邀请电子邮件(我需要ResetPasswordToken,因为这是我当前的应用程序流程),Auth API 负责密码恢复(我需要ResetPasswordToken)。

当然,我需要为两个应用程序指定相同的机器密钥。

我们还假设这两个应用程序将部署在负载平衡器后面。 2 个应用 x 3 个实例。

两个 API 中的持久密钥(Redis 或其他)具有相同的共享位置就足够了?

services.AddDataProtection().PersistKeysToRedis(/* */);

我在想,如果它适用于一个应用程序、多实例场景,那么它也适用于多个应用程序、多实例场景。

P.S:我找不到任何关于任何锁定机制的信息(似乎有一个只是在看它的行为)

我关心的另一件事:比赛条件?!

Duc_Thuan_Nguy 2017 年 6 月 9 日

出于好奇,键是如何滚动的 处理并发?例如,假设我们有一个有 2 个 机器和共享网络目录。可能存在竞争条件 其中两台机器都想同时滚动一个新密钥。怎么 这种情况处理了吗?或者两台机器可以自己滚新 密钥,只要他们可以访问两个新密钥,他们就可以 顺利解除数据保护?

评论参考:https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/implementation/key-management

稍后编辑:看起来如果您有多个应用程序,仅指定要将密钥保存在同一位置是不够的。有一个应用程序鉴别器的概念(所有应用程序都被隔离)。

您将需要以下内容:

services.AddDataProtection(configure => {
                configure.ApplicationDiscriminator = "App.X";
            }).PersistKeysToRedis(/* */);

锁定和竞争条件问题仍然有效。

【问题讨论】:

  • 这是您使用负载均衡器的典型做法,以确保负载均衡器后面的服务器在服务器上配置相同的机器密钥。您希望每个服务器本质上是相同的
  • 关于比赛条件问题的原始 github 票:github.com/wpbrown/oakproxy/issues/52

标签: c# asp.net-core asp.net-core-2.0


【解决方案1】:

不,这还不够。 ASP.NET Core 的数据保护默认根据文件路径或 IIS 托管信息隔离应用程序,因此多个应用程序可以共享一个密钥环,但仍无法读取彼此的数据。

作为docs state

默认情况下,数据保护系统会将应用相互隔离, 即使他们共享相同的物理密钥存储库。这 阻止应用了解彼此的受保护有效负载。 要在两个应用程序之间共享受保护的负载,请使用 SetApplicationName 每个应用都具有相同的值

public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
        .SetApplicationName("shared app name");
}

【讨论】:

  • 考虑到两个 api 使用相同的应用程序名称,我们是否需要担心哪个会生成密钥?或者是否有任何竞争条件问题?
  • 不,我们通过将密钥有效期缩短到一分钟并运行了 50 个虚拟机来进行测试 ?
  • 在文档中明确说明竞争条件不是问题肯定是一个受欢迎的补充,因为我相信许多开发人员担心他们的应用程序有一个“主”实例单独负责生成密钥。
  • @Ian 为什么不关心比赛条件? ASP.NET Core 如何解决冲突?
  • @kogoia - 我不知道,这就是为什么我说如果 MS 告诉我们就好了。
【解决方案2】:

对此的快速更新:似乎可以通过在除“主”应用之外的所有应用上使用 DisableAutomaticKeyGeneration 方法来消除竞争条件。

即会是

    services.AddDataProtection()
        .SetApplicationName("shared app name");

对于主要的和

    services.AddDataProtection()
        .SetApplicationName("shared app name")
        .DisableAutomaticKeyGeneration();

适用于所有其他应用

【讨论】:

    猜你喜欢
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-01
    • 2014-06-04
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    相关资源
    最近更新 更多