我有一个Service Fabric项目,其中我有一个无状态的WebAPI项目。创建新用户时,我们会生成一个令牌。我使用了Identity framework的UserManager.GenerateUserToken,如下所示:
var inviteUserToken = await userManager.GenerateUserTokenAsync(user, "PasswordTokenProvider", "Password");
我们通过邮件发送此令牌,并将其重新发送到服务器进行验证。验证方法如下:
var verifyToken = await userManager.VerifyUserTokenAsync(user, "PasswordTokenProvider", "Password", inviteUserToken);
现在我有两个环境:一个是 1 节点群集,另一个是 3 节点群集。 一切都在 1 节点集群中完美运行。但在 3 节点群集中,验证令牌行为非常随机。它有时有效,有时无法验证。
注意:除了节点数外,两种环境完全相同。
您面临的问题是,用于生成令牌的加密密钥在每个节点(机器(上都不同。 即:当您在节点 1 上生成令牌时,它使用密钥 123,但当您在节点 2 上解码时,它使用密钥 345。群集中的每个节点都必须使用相同的密钥才能正常工作。
过去,这些由 machine.config 自动生成的密钥定义,在 dotnet core 上,它基于数据保护自动生成的密钥。
您有以下几种选择:
- 将这些密钥存储在共享网络文件夹中
- 将这些密钥存储在 Blob 存储中
- 在运行应用程序的每个节点上复制它们
然后,您将使用类似于以下内容的代码注册它:
public void ConfigureServices(IServiceCollection services)
{
services.AddDataProtection()
.PersistKeysToFileSystem(new DirectoryInfo(@"\serversharedirectory"))
}
确保保护对这些密钥的访问,以避免意外访问。您可能还决定加密这些密钥,以避免在它们被泄露时使用。
您可能还需要将 TokenOptions 配置为使用新的数据保护提供程序,请查看此链接了解更多详细信息。