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

时间:2017-12-07 10:35:24

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

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

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

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

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

在两个API中使用相同的共享位置来保存密钥(Redis或左右)就足够了吗?

ResetPasswordToken

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

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().PersistKeysToRedis(/* */);

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

2 个答案:

答案 0 :(得分:7)

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

作为docs state

  

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

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

答案 1 :(得分:0)

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

即它会

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

主要和

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

对于所有其他应用