确认电子邮件地址时无效的令牌 - Asp.Net Core
我偶尔会收到我致电 userManager.ConfirmEmailAsync(user, token)
的“无效令牌”错误。我已经将问题缩小到了这样一个事实,即我的2个Web服务器位于负载平衡器后面,并且生成令牌的Web服务器并不总是试图确认令牌的Web服务器。我在另一个网站中遇到了类似于防伪令牌的问题,我通过将数据保护密钥持久保存在磁盘上并在网络服务器之间共享它来解决这个问题,所以我在这里尝试了类似的方法。确认电子邮件地址时无效的令牌 - Asp.Net Core
services.AddDataProtection()
.PersistKeysToFileSystem(new DirectoryInfo(@"c:\temp\API"));
然后我将密钥复制到我的其他web服务器中的同一文件夹,但仍然不成功。通过AspNetCore.Identity代码调试,我可以在DataProtectorTokenProvider类看到扔在调用一个例外
var unprotectedData = Protector.Unprotect(Convert.FromBase64String(token))
。在微软的代码异常的catch块根本
catch
{
// Do not leak exception
}
所以我决定注入的IDataProtector到我自己的控制器,并尝试作出这一呼吁自己。
public UserController(Microsoft.AspNetCore.Identity.UserManager<ApplicationUser> userManager,
SignInManager<ApplicationUser> signInManager, Microsoft.AspNetCore.Identity.RoleManager<IdentityRole> roleManager,
ILoggerFactory loggerFactory,
IDataProtectionProvider dataProtectionProvider)
{
Protector = dataProtectionProvider.CreateProtector("DataProtectorTokenProvider");
}
try
{
var unconverted = Convert.FromBase64String(request.EmailConfirmationToken);
var unprotectedData = Protector.Unprotect(unconverted);
}
catch (Exception e)
{
}
我现在能赶上扔在解除呼叫例外,它是:
有效载荷无效
Microsoft.AspNetCore.DataProtection.Cng.CbcAuthenticatedEncryptor.DecryptImpl(BYTE * pbCiphertext,UInt32的cbCiphertext,BYTE * pbAdditionalAuthenticatedData,UInt32的cbAdditionalAuthenticatedData个)\ r \ n在Microsoft.AspNetCore.DataProtection.Cng.Internal.CngAuthenticatedEncryptorBase.Decrypt(ArraySegment 1 ciphertext, ArraySegment
1 additionalAuthenticatedData个)\ r \ n在Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector。 UnprotectCore(字节[] protectedData,布尔allowOperationsOnRevokedKeys,UnprotectStatus &状态个)\ r \ n在Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.DangerousUnprotect(字节[] protectedData,布尔ignoreRevocationErrors,布尔& requiresMigration,布尔& wasRevoked)\ r \ n在Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.Unprotect(Byte [] protectedData)\ r \ n在VTR.API.Controllers.UserController.d__16.MoveNext()在C:\ Projects \ Brewster.Travel \ src \ cres \ trunk \ VTR.API \ src \ VTR.API \ Controllers \ UserController.cs:line 409
如果我使用在同一台服务器上生成的令牌进行调用,那么它会成功取消保护。我显然遇到了一些问题,我试图分享我的数据保护密钥,如果有人能够阐明我的问题,我将不胜感激。
我设法得到这个工作,多亏了文档浏览:https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/configuration/overview
我需要在ConfigureServices添加到SetApplicationName()的调用:
services.AddDataProtection()
.PersistKeysToFileSystem(new DirectoryInfo(@"c:\someDirectory"))
.SetApplicationName("myApplicationName");