身份框架GenerateUserToken验证问题

时间:2018-08-22 11:37:35

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

我有一个Service Fabric项目,其中有一个无状态的WebAPI项目。创建新用户后,我们会生成一个令牌。我已经使用了Identity框架的UserManager.GenerateUserToken,如下所示:

var inviteUserToken = await userManager.GenerateUserTokenAsync(user, "PasswordTokenProvider", "Password");

我们通过邮件发送此令牌,它将被重新发送到服务器进行验证。验证方法如下:

  var verifyToken = await userManager.VerifyUserTokenAsync(user, "PasswordTokenProvider", "Password", inviteUserToken);

现在我有两个环境:一个具有1个节点的群集,另一个具有3个节点的群集。 在1节点群集中,一切工作正常。但是在3节点群集中,验证令牌的行为非常随机。有时可行,有时无法验证。

注意:除了节点数以外,两种环境完全相同。

1 个答案:

答案 0 :(得分:2)

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

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

您有几种选择:

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

然后,您将使用类似于以下代码的代码进行注册:

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

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

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