繁体   English   中英

ASP.NET MVC和身份 - 重置密码不起作用

[英]ASP.NET MVC and Identity - Reset password doesn't work

我有重置用户帐户密码的问题。 我使用微软的方式来做到这一点,但它只是没有用。 这是我用来生成重置密码令牌的代码

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();
}

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

我究竟做错了什么?

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

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

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

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

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

Troy Hunt强烈推荐的关于密码重置的文章 - 如果您使用密码,这是非常有价值的读物。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM