【问题标题】:Asp.net core Identity Password reset "invalid token" even though tokens generated are identical即使生成的令牌相同,Asp.net 核心身份密码重置“无效令牌”也是如此
【发布时间】:2021-08-09 13:02:49
【问题描述】:

我在 Asp.Net 核心上使用 .Net 5.0 在启动时我已添加;

        services.AddIdentity<ApplicationUser, ApplicationRole>(SetupIdentityOptions)
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();
        
        services.Configure<DataProtectionTokenProviderOptions>(opt => 
            {
                opt.TokenLifespan = TimeSpan.FromDays(1);
            }
        );

我生成如下代码(按照 MS 文档进行编码);

            var code = await CommonServices.UserManager.GeneratePasswordResetTokenAsync(user);
            code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));

            var callbackUrl = $"{request.RequestData.ReturnUrl}?code={code}";

现在,如果我保存此时生成的代码并在用户单击链接后检查接收到控制器的代码,它们是相同的。但是当我这样做时;

var result = await CS.UserManager.ResetPasswordAsync(user, model.Code, model.Password);

它给了我“无效令牌”但是令牌是相同的。

然后我尝试了这个,仍然说无效令牌;

var isValidToken = await _userManager.VerifyUserTokenAsync(
user,
_userManager.Options.Tokens.PasswordResetTokenProvider,
UserManager<TUser>.ResetPasswordTokenPurpose,
code);

我不确定身份框架是否将生成的令牌保存在 [AspNetUserTokens] 表中。生成令牌后找不到任何已保存的令牌。

可能是什么问题?

【问题讨论】:

    标签: asp.net-core .net-5 asp.net-identity-3


    【解决方案1】:

    我的错,我不得不将我没有完成的编码字符串转换回来。

    所以,既然我用过

    code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
    

    用户点击链接后,我必须;

    var bytes = WebEncoders.Base64UrlDecode(model.Code);
    var code = Encoding.UTF8.GetString(bytes);
    

    然后调用

    ResetPasswordAsync(user, code, model.Password);
    

    哪个有效

    【讨论】:

      猜你喜欢
      • 2015-02-21
      • 2015-01-30
      • 2020-02-29
      • 2018-09-30
      • 2017-09-10
      • 2017-02-03
      • 2019-09-11
      • 2017-08-12
      • 1970-01-01
      相关资源
      最近更新 更多