DataProtection - 在多个应用程序之间共享机器密钥

Raz*_*tru 4 c# asp.net-core asp.net-core-2.0

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

UserManagement API负责初始邀请电子邮件(我需要一个,ResetPasswordToken因为这是我目前的应用流程),Auth API并负责密码恢复(我需要的地方ResetPasswordToken).

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

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

在两个API中保持密钥(Redis等)的共享位置是否足够?

services.AddDataProtection().PersistKeysToRedis(/* */);
Run Code Online (Sandbox Code Playgroud)

我认为如果它适用于一个应用程序,多个实例场景,它将适用于多个应用程序,多个实例场景.

PS:我无法找到任何关于任何锁定机制的东西(似乎只有一个看看它的行为)

我关心的另一件事:竞争条件?!

Duc_Thuan_Nguy 2017年6月9日

出于好奇,密钥滚动如何处理并发?例如,假设我们有一个包含2台计算机和共享网络目录的Web场.可能存在竞争条件,其中两台机器同时想要滚动新密钥.这种情况如何处理?或者两台机器可以自己刷新密钥,只要它们可以访问这两个新密钥,它们就可以平滑地取消保护数据?

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

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

您将需要以下内容:

services.AddDataProtection(configure => {
                configure.ApplicationDiscriminator = "App.X";
            }).PersistKeysToRedis(/* */);
Run Code Online (Sandbox Code Playgroud)

锁定和竞赛条件问题仍然有效.

blo*_*art 8

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

正如文档所述

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

public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
        .SetApplicationName("shared app name");
}
Run Code Online (Sandbox Code Playgroud)

  • 不,我们通过将关键有效期缩短到一分钟并运行了50个虚拟机来进行测试 (3认同)
  • 明确指出竞争条件不是问题,这无疑是一个受欢迎的补充,因为我确信许多开发人员担心他们的应用程序有一个单独负责生成密钥的“主”实例。 (2认同)