【问题标题】:Identity Framework GenerateUserToken validation issue身份框架 GenerateUserToken 验证问题
【发布时间】:2019-01-28 15:57:39
【问题描述】:

我有一个 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 节点集群中,验证令牌的行为是非常随机的。它有时有效,有时无法验证。

注意:两个环境完全相同,只是节点数不同。

【问题讨论】:

标签: c# azure .net-core asp.net-identity azure-service-fabric


【解决方案1】:

您面临的问题是因为用于生成令牌的加密密钥在每个节点(机器)上都不同。即:当您在 node1 上生成令牌时,它使用密钥 123,但当您在 ​​node2 上解码时,它使用密钥 345。集群中的每个节点必须使用相同的密钥才能正常工作。

过去,这些由 machine.config 自动生成的密钥定义,在 dotnet 核心上它基于 data protection 自动生成的密钥。

你有几个选择:

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

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

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

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

您可能还需要配置TokenOptions 以使用新的数据保护提供程序,请查看this link 了解更多详细信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-11
    • 2021-10-02
    • 2013-06-29
    • 2017-09-26
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多