当前位置: 首页 > 知识库问答 >
问题:

ASP。NET核心无效密码重置令牌

东门翰
2023-03-14

我有两台服务器使用相同的ASP。NET核心标识后端。我使用以下命令生成密码重置令牌:

var token = await _userManager.GeneratePasswordResetTokenAsync(applicationUser);

我通过电子邮件链接发送此令牌。当用户单击链接时,他们会被带到一个单独的站点,该站点应提供一个用户界面来更改密码。以下代码处理用户提交令牌及其新密码的密码:

var identityResult = await _userManager.ResetPasswordAsync(applicationUser, code, password);

在第二台服务器上,标识结果总是返回false,因为“无效令牌”。

通过查看源代码,我看到令牌是使用IP地址生成的(因此我理解令牌验证失败的原因)。

我的问题是如何在不同的机器上成功创建/验证令牌?在以前的ASP形式中。NET中,我可能会使用共享机器密钥来防止这些情况。ASP。NetCore似乎没有类似的概念。据我所知,这似乎是一个使用DataProtection API的场景。不幸的是,我还没有看到如何将其应用于生成重置令牌的任何示例。

共有3个答案

王庆
2023-03-14

我也面临类似的问题。它不是关于2服务器实际上。这是关于身份框架的。您可以从用户管理器派生,并且可以用中央管理器覆盖提供商。但是我尝试了一些不同的方法,而且奏效了。首先ConfirmEmail方法查看数据库,如果您有一个数据库,那么具有多个服务器的令牌之间不应该有问题。

在usermanager中,您应该像这样在构造函数中创建dataprovider。

 public ApplicationUserManager(IUserStore<ApplicationUser> store)
            : base(store)
        {
            var dataProtectorProvider = Startup.DataProtectionProvider;
            var dataProtector = dataProtectorProvider.Create("My Identity");
            this.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser, string>(dataProtector);
            //this.UserTokenProvider.TokenLifespan = TimeSpan.FromHours(24);
        }

此外,您还应该在数据库表中为用户查看令牌。在这行代码之后。

    string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
    var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
    UserManager.EmailService = new EmailService();
    await UserManager.SendEmailAsync(user.Id, "Confirm your account", "Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>");

当您在数据库中看到令牌时,请检查电子邮件中是否有相同的令牌。然后单击回调url并更正url的编码。

用于使用dataProtectorProvider;

public partial class Startup
    {
      public static IDataProtectionProvider DataProtectionProvider { get; set; }

        public void ConfigureAuth(IAppBuilder app)
        {
           DataProtectionProvider = app.GetDataProtectionProvider();
        }
}
廖绍辉
2023-03-14

您是否已尝试在两个应用程序中将应用程序名称设置为相同的值?

services.AddDataProtection().SetApplicationName("same for both apps");

https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/configuration/overview

另外,我也在为同样的问题挣扎。

章飞虎
2023-03-14

您应该在发送令牌之前对其进行编码。你应该这样做:

var token = await _userManager.GeneratePasswordResetTokenAsync(applicationUser);
var encodedCode = HttpUtility.UrlEncode(token);

编码后,必须传递编码令牌,而不是生成的令牌。

 类似资料:
  • 我只是在我的项目中添加了MVC 5的“忘记密码”部分,在收到邮件后我无法更改密码。 错误:在应用程序中= 在Visual Studio中= 错误来源代码: 我在stackoverflow和其他方面尝试了很多东西,但都没有成功。 如果你知道我为什么会出现这个错误:) 我使用在创建ASP时提出的基本模板。NET web app。我可以上传你想要的所有代码文件,只要问你需要什么帮助我,我会在2分钟内上传

  • 我正在ASP. NET中实现自己的重置密码。在重置密码中,首先我创建一个随机字符串并将其邮寄到用户电子邮件。对于电子邮件中的链接,如http://xyz.com/account/forgot?random=xxxx

  • 我写的是MVC5,使用的是Identity 2.0。 我在邮件中点击链接,我正在获得密码重置令牌并使用 结果总是false,并表示“无效令牌”。我该在哪里修?

  • 我有一个生成密码重置令牌的Webapi服务。 令牌生成服务endpoint:

  • 为什么通过或请求服务被认为是不良做法。我可以到处阅读这条语句: 建议使用构造函数注入,而不是使用RequestServices获取它。 我的想法正好相反。尽可能使用Request estServices。让我解释一下为什么。我想让控制器尽可能小,这样我就可以创建单独的服务。这样,我的控制器就干净了: 所有服务都继承自base,其中包含用于管理权限、缓存sql请求的逻辑…… 使用构造函数方法,我得到

  • 遵循以下文档:https://docs.microsoft.com/fr-fr/aspnet/core/grpc/authn-and-authz?view=aspnetcore-3.0#承载令牌身份验证,我尝试配置我的GRPC客户端以自动注入JWT令牌。 但它被Grpc.Core中的一个例外“提供的通道凭据不允许组合”窒息 这是什么意思?我应该如何提供HTTP授权标头?