确认电子邮件地址时无效令牌 - Asp.Net Core

时间:2017-04-04 21:27:33

标签: asp.net-core asp.net-identity asp.net-core-mvc asp.net-core-identity

我的呼叫偶尔会出现“无效令牌”错误 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行

如果我使用在同一服务器上生成的令牌进行该调用,则会成功取消保护。我显然有一些问题,我试图分享我的数据保护密钥,如果有人可以解释我的问题我会很感激。

1 个答案:

答案 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");