【发布时间】:2017-04-04 21:27:32
【问题描述】:
我偶尔会从我的调用中收到“无效令牌”错误
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 类中。微软代码中异常的 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@ 987654326@1 additionalAuthenticatedData)\r\n 在 Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.UnprotectCore(Byte[] protectedData, Boolean allowOperationsOnRevokedKeys, UnprotectStatus& 状态)\r\n 在 Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.DangerousUnprotect( Byte[] protectedData, Boolean ignoreRevocationErrors, Boolean& requiresMigration, Boolean& wasRevoked)\r\n 在 Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.Unprotect(Byte[] protectedData)\r\n 在 VTR.API.Controllers.UserController.d__16 C:\Projects\Brewster.Travel\src\cres\trunk\VTR.API\src\VTR.API\Controllers\UserCo 中的 .MoveNext() ntroller.cs:第 409 行
如果我使用在同一台服务器上生成的令牌进行调用,那么它会成功不受保护。我显然对如何尝试共享我的数据保护密钥有一些问题,如果有人能解释我的问题,我将不胜感激。
【问题讨论】:
标签: asp.net-core asp.net-identity asp.net-core-mvc asp.net-core-identity