我通过继承
DataProtectorTokenProvider
然后注册它来实现自定义令牌提供程序。
我可以生成代币,但它们只能在同一个项目内验证。
我需要在
UserManager
在一个网站内运行时生成令牌,然后使用相同的 UserManager
代码但在不同的网站中运行来验证令牌。
两个网站都可以
builder.Services.AddDataProtection().SetApplicationName("Whatever");
我认为设置应用程序名称可以绕过“安全”废话,但显然不是。
当第二个网站尝试验证令牌时,它失败了
所提供的有效负载无法解密,因为它不受此保护提供程序的保护。有关更多信息,请访问 http://aka.ms/dataprotectionwarning
有什么想法让它发挥作用吗?
或者我是否需要解决方法,例如将令牌存储在
UserTokens
表中?
与
"Logging": {
"LogLevel": {
"Microsoft.AspNetCore.DataProtection": "Trace"
},
创建我看到的令牌时
Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector: Trace: Performing protect operation to key {7f8d00fb-e304-4476-9f01-1277b8936886} with purposes ('Whatever', 'RegistrationTokenProvider').
当尝试验证时我看到:
Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector: Trace: Performing unprotect operation to key {7f8d00fb-e304-4476-9f01-1277b8936886} with purposes ('Whatever', 'RegistrationTokenProvider').
GUID 是相同的,并且
Whatever
似乎是转移注意力,因为我的 RegistrationTokenProvider
在这两种情况下都存在。
那么这个蠢货到底是怎么回事呢?
如果您想在应用程序之间共享令牌,请确保它们访问相同的数据保护密钥 通过使用
'.PersistKeysToFileSystem()'
为密钥配置共享存储(示例 -> 公共文件系统路径)。
两个应用程序还必须使用“.SetApplicationName("Whatever")'
”来调整数据保护上下文。
如果问题仍然存在,您可以考虑集中式身份验证解决方案,例如 OAuth2/OpenID Connect 或用于令牌验证的共享数据库,
尽管这些方法有其复杂性。关键配置差异,s
例如加密算法,应该进行检查以确保它们在应用程序之间匹配。