我偶爾會收到我致電 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
如果我使用在同一臺服務器上生成的令牌進行調用,那麼它會成功取消保護。我顯然遇到了一些問題,我試圖分享我的數據保護密鑰,如果有人能夠闡明我的問題,我將不勝感激。