【问题标题】:ASP.NET MVC and Identity - Reset password doesn't workASP.NET MVC 和身份 - 重置密码不起作用
【发布时间】:2015-02-28 21:45:35
【问题描述】:

我在重置用户帐户密码时遇到问题。我正在使用微软的方式来做到这一点,但它只是不工作。这是我用来生成重置密码令牌的代码

var resetPasswordToken = new ResetPasswordToken
{
    Id = Guid.NewGuid().ToString(),
    Token = UserManager.GeneratePasswordResetToken(user.Id),
    User = user,
    ValidFrom = DateTime.Now,
    ValidTo = DateTime.Now.AddMinutes(ApplicationConstants.SettingsResetPasswordTokensValidTimeInMinutes)
};

_resetPasswordTokensRepository.Insert(resetPasswordToken);
_resetPasswordTokensRepository.Save();

var email = new ResetPasswordEmailModel
{
    ResetPasswordToken = resetPasswordToken,
    User = user
};

IUserMailer mailer = new UserMailer();
mailer.ResetPassword(email).Send();

这很好,我在数据库中有令牌,我通过电子邮件将它发送给用户。然后用户必须单击该链接。以下是我如何生成新密码并将旧密码替换为数据库中的新密码。

var resetPasswordToken = _resetPasswordTokensRepository.GetByEmailAndToken(email, code);
var newPassword = Membership.GeneratePassword(10, 2);

var result = await UserManager.ResetPasswordAsync(user.Id, resetPasswordToken.Token, newPassword);
if (result.Succeeded)
{
    _resetPasswordTokensRepository.Remove(resetPasswordToken);
    _usersRepository.Save();

    var model = new NewPasswordEmailModel
    {
        User = user,
        Password = newPassword
    };

    IUserMailer mailer = new UserMailer();
    mailer.NewPassword(model).Send();
}

这也有效。我的意思是它更改数据库中的密码并通过电子邮件将其发送给用户。问题是用户无法使用新密码或旧密码登录。 我这里没有展示,但是我检查了数据库中是否同时存在令牌和用户。

我做错了什么?

【问题讨论】:

  • 您是否有一个 IsConfirmed 列可能被设置为 false?
  • 我在 AspNetUser 表中确实有 EmailConfirmed 列,但它总是设置为 false 并且没有问题(一切正常)。它可能因此而不起作用吗? Edit我改了还是不行。
  • 如果它在此之前有效,那可能不是问题,这只是我之前发现的东西,所以我想我会提到它!
  • 我修好了。这不是代码错误,但我更改了数据库中的用户电子邮件并尝试重置他的密码。当我使用这封电子邮件添加新用户时,一切正常:)
  • 我遇到了同样的问题,你能扩展你的解决方案吗?

标签: c# asp.net-mvc asp.net-identity


【解决方案1】:

尽管您已经发现了问题,但我会尝试指出更好的方向。

  1. 你所描述的不是“微软”的方式。我第一次看到这样的东西。这是模板的一部分吗?打开 Visual Studio 2013 并使用个人帐户创建一个新的 MVC 项目 - 这将为您提供“Microsoft”方式。

  2. 您将令牌保存在数据库中。没必要。令牌应作为链接通过电子邮件发送给用户,然后由用户单击,这样令牌将传递给您重置电子邮件的控制器。

  3. 您为用户生成了一个新密码。不要那样做——让用户自己选择密码。为此,您使用 Membership - 混合身份和 MembershipProvider 的不良做法。 MebershipProvider 非常具有侵略性,并会在可能的情况下尝试接管。它可能会在生命周期的后期引起问题。

  4. 您将密码通过电子邮件发送给用户。非常糟糕的安全实践。电子邮件不是一个安全的渠道。让用户在您的网页上选择他们的新密码,并且永远不要通过电子邮件发送密码。

Troy Hunt about password resetting 强烈推荐的文章 - 如果您使用密码,则非常值得一读。

【讨论】:

  • 1.是的,这就是我所说的“微软”方式。 2. 我知道,但我想保存在数据库中。密码重置完成后,我将其从数据库中删除。 3 i 4. 想了想,最后改成不通过邮件发送密码了。现在用户可以设置自己的密码。谢谢:)
猜你喜欢
  • 2020-02-29
  • 2014-07-06
  • 1970-01-01
  • 2020-08-25
  • 1970-01-01
  • 2018-05-21
  • 2011-08-17
  • 2013-11-28
  • 1970-01-01
相关资源
最近更新 更多