【发布时间】: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