假设我们有两个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(/* */);
锁定和竞赛条件问题仍然有效。
答案 0 :(得分:7)
不,这还不够。 ASP.NET Core的数据保护默认根据文件路径或IIS托管信息隔离应用程序,因此多个应用程序可以共享一个密钥环,但仍然无法读取彼此的数据。
默认情况下,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();
对于所有其他应用