身份框架 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 以获得更多详细信息。
我有一个 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 以获得更多详细信息。