身份框架 GenerateUserToken 验证问题

Identity Framework GenerateUserToken validation issue

我有一个 Service Fabric 项目,其中有一个无状态 WebAPI 项目。创建新用户时,我们会生成一个令牌。我使用身份框架的 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 核心上它基于 data protection 自动生成的密钥。

您有几个选择:

  • 将这些密钥存储在共享网络文件夹中
  • 将这些密钥存储在 blob 存储中
  • 将它们复制到应用程序运行的每个节点上

然后,您将使用类似这样的代码注册它:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
        .PersistKeysToFileSystem(new DirectoryInfo(@"\server\share\directory\"))
}

确保保护对这些密钥的访问以避免意外访问。您可能还决定对这些密钥进行加密以避免在它们遭到破坏时被使用。

您可能还需要配置 TokenOptions to use the new data protection provider, take a look at this link 以获得更多详细信息。