我的呼叫偶尔会出现“无效令牌”错误
userManager.ConfirmEmailAsync(user, token)
。我已经将问题缩小到我的2个Web服务器位于负载均衡器后面的事实,并且生成令牌的Web服务器并不总是尝试确认令牌的Web服务器。我在不同的网站上遇到过与防伪令牌类似的问题,我通过将数据保护密钥保存到磁盘并在Web服务器之间共享来修复,所以我在这里尝试了类似的方法。
services.AddDataProtection()
.PersistKeysToFileSystem(new DirectoryInfo(@"c:\temp\API"));
然后我将密钥复制到我的其他Web服务器中的同一文件夹但仍未成功。通过AspNetCore.Identity代码进行调试我可以看到调用
时抛出的异常var unprotectedData = Protector.Unprotect(Convert.FromBase64String(token))
DataProtectorTokenProvider类中的。 Microsoft代码中异常的catch块只是
catch
{
// Do not leak exception
}
所以我决定将IDataProtector注入我自己的Controller并尝试自己进行调用。
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)
{
}
我现在可以捕获Unprotect调用抛出的异常,它是:
有效负载无效
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}} 1 additionalAuthenticatedData)\ r \ n在Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector的Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtction.UnprotectCore(Byte [] protectedData,Boolean allowOperationsOnRevokedKeys,UnprotectStatus&amp; status)\ r \ n .DangerousUnprotect(Byte [] protectedData,Boolean ignoreRevocationErrors,Boolean&amp; requiresMigration,Boolean&amp; wasRevoked)\ r \ n在Microsoft的电子证书。 C:\ Projects \ Brewster.Travel \ src \ cres \ trunk \ VTR.API \ src \ VTR.API \ Controllers \中的Controllers.UserController.d__16.MoveNext() UserController.cs:第409行
如果我使用在同一服务器上生成的令牌进行该调用,则会成功取消保护。我显然有一些问题,我试图分享我的数据保护密钥,如果有人可以解释我的问题我会很感激。
答案 0 :(得分:0)
感谢此处的文档:https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/configuration/overview
,我设法让这项工作成功我需要在ConfigureServices中添加对SetApplicationName()的调用:
services.AddDataProtection()
.PersistKeysToFileSystem(new DirectoryInfo(@"c:\someDirectory"))
.SetApplicationName("myApplicationName");