【问题标题】:Invalid Token when confirming email address - Asp.Net Core确认电子邮件地址时令牌无效 - Asp.Net Core
【发布时间】: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


    【解决方案1】:

    感谢这里的文档:https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/configuration/overview

    我需要在 ConfigureServices 中添加对 SetApplicationName() 的调用:

    services.AddDataProtection()
              .PersistKeysToFileSystem(new DirectoryInfo(@"c:\someDirectory"))
              .SetApplicationName("myApplicationName");
    

    【讨论】:

      猜你喜欢
      • 2016-12-11
      • 2015-12-13
      • 1970-01-01
      • 2016-06-07
      • 2018-03-19
      • 2015-10-08
      • 2015-01-06
      • 1970-01-01
      • 2020-08-07
      相关资源
      最近更新 更多