Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC和身份-重置密码不';行不通_C#_Asp.net Mvc_Asp.net Identity - Fatal编程技术网

C# ASP.NET MVC和身份-重置密码不';行不通

C# ASP.NET MVC和身份-重置密码不';行不通,c#,asp.net-mvc,asp.net-identity,C#,Asp.net Mvc,Asp.net Identity,我无法重置用户帐户的密码。我用微软的方式来做,但它只是不工作。下面是我用来生成重置密码令牌的代码 var resetPasswordToken=新的resetPasswordToken { Id=Guid.NewGuid().ToString(), Token=UserManager.GeneratePasswordResetToken(user.Id), 用户=用户, ValidFrom=DateTime。现在, ValidTo=DateTime.Now.AddMinutes(Applicat

我无法重置用户帐户的密码。我用微软的方式来做,但它只是不工作。下面是我用来生成重置密码令牌的代码

var resetPasswordToken=新的resetPasswordToken
{
Id=Guid.NewGuid().ToString(),
Token=UserManager.GeneratePasswordResetToken(user.Id),
用户=用户,
ValidFrom=DateTime。现在,
ValidTo=DateTime.Now.AddMinutes(ApplicationConstants.SettingsResetPasswordTokensValidTimeInMinutes)
};
_resetPasswordTokensRepository.Insert(resetPasswordToken);
_resetPasswordTokensRepository.Save();
var email=new ResetPasswordEmailModel
{
ResetPasswordToken=ResetPasswordToken,
用户=用户
};
IUserMailer-mailer=新用户mailer();
mailer.ResetPassword(email.Send();
这很好,我在数据库中有令牌,我通过电子邮件将其发送给用户。然后用户必须单击链接。下面是我如何在数据库中生成新密码并用新密码替换旧密码的方法

var resetPasswordToken=\u resetPasswordTokensRepository.GetByEmailAndToken(电子邮件,代码);
var newPassword=Membership.GeneratePassword(10,2);
var result=await UserManager.ResetPasswordAsync(user.Id,resetPasswordToken.Token,newPassword);
if(result.successed)
{
_resetPasswordTokensRepository.Remove(resetPasswordToken);
_usersRepository.Save();
var model=NewPasswordEmailModel
{
用户=用户,
密码=新密码
};
IUserMailer-mailer=新用户mailer();
mailer.NewPassword(model.Send();
}
这也行得通。我的意思是它更改数据库中的密码,并通过电子邮件发送给用户。问题是用户无法使用新密码或旧密码登录。 我并没有在这里显示它,但我检查数据库中是否同时存在令牌和用户


我做错了什么?

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

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

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

  • 为用户生成新密码。不要这样做-让用户选择自己的密码。您使用
    会员资格
    来实现这一点——将身份和会员资格提供者混为一谈的糟糕做法。MebershipProvider非常具有侵略性,并试图在可能的时候接管。它可能会在以后的生命周期中引发问题

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


  • 高度推荐的文章-如果你使用密码,这是一本非常值得一读的书

    您是否有一个
    IsConfirmed
    列被设置为false?我确实在AspNetUser表中有EmailConfirmed列,但它总是被设置为false,这不是问题(一切都正常)。有没有可能因为这个原因它就不起作用了?我改变了它,但它仍然不起作用。如果它在那之前起作用,那么它可能不是问题所在,它只是一些让我以前感到困惑的东西,所以我想我会提到它!我修好了。代码中并没有错误,但我在数据库中更改了用户的电子邮件,并试图重置他的密码。当我在这封电子邮件中添加新用户时,一切都正常:)我遇到了同样的问题,你能详细介绍一下你的解决方案吗?1。是的,这就是我所说的“微软”方式。2.我知道,但我想留在数据库里。密码重置完成后,我将其从数据库中删除。3我4。我想了想,最后我把它改成不通过电子邮件发送密码。现在用户可以设置自己的密码。谢谢:)