加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – ASP.NET MVC5中的密码恢复

发布时间:2020-12-15 08:36:00 所属栏目:百科 来源:网络整理
导读:我在ASP.NET MVC 5应用程序中工作.用户可以无任何问题进行注册和登录.但是,当一个用户忘记他/她的密码时,忘记密码进程(已经到位)没有做任何事情!没有电子邮件发送给用户,点击此处重置密码链接. 目前我的ForgotPassword操作方法如下所示: [HttpPost][AllowA
我在ASP.NET MVC 5应用程序中工作.用户可以无任何问题进行注册和登录.但是,当一个用户忘记他/她的密码时,忘记密码进程(已经到位)没有做任何事情!没有电子邮件发送给用户,点击此处重置密码链接.

目前我的ForgotPassword操作方法如下所示:

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> ForgotPassword(ForgotPasswordViewModel model)
{
    if (ModelState.IsValid)
    {
        var user = await UserManager.FindByNameAsync(model.Email);
        if (user == null || !(await UserManager.IsEmailConfirmedAsync(user.Id)))
        {
            // Don't reveal that the user does not exist or is not confirmed
            return View("ForgotPasswordConfirmation");
        }
    }

    // If we got this far,something failed,redisplay form
    return View(model);
}

我猜这是留给开发人员实现的.我用Google搜索,发现没有什么是直截了当的.

允许这种最简单的方法是什么?

解决方法

忘记密码操作以生成重置令牌:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> ForgotPassword(ForgotPasswordViewModel model)
{
    if (ModelState.IsValid)
    {
        var user = await UserManager.FindByNameAsync(model.Email);
        if (user == null || !(await UserManager.IsEmailConfirmedAsync(user.Id)))
        {
            // Don't reveal that the user does not exist or is not confirmed
            return View("ForgotPasswordConfirmation");
        }

        // For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=320771
        // Send an email with this link
        string code = await UserManager.GeneratePasswordResetTokenAsync(user.Id);
        var callbackUrl = Url.Action("ResetPassword","Account",new { userId = user.Id,code = code },protocol: Request.Url.Scheme);      
        await UserManager.SendEmailAsync(user.Id,"Reset Password","Please reset your password by clicking <a href="" + callbackUrl + "">here</a>");
        return RedirectToAction("ForgotPasswordConfirmation","Account");
    }

    // If we got this far,redisplay form
    return View(model);
}

重置密码操作以根据生成的令牌重置密码:

[AllowAnonymous]
public ActionResult ResetPassword(string code)
{
    return code == null ? View("Error") : View();
}

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> ResetPassword(ResetPasswordViewModel model)
{
    if (!ModelState.IsValid)
    {
        return View(model);
    }
    var user = await UserManager.FindByNameAsync(model.Email);
    if (user == null)
    {
        // Don't reveal that the user does not exist
        return RedirectToAction("ResetPasswordConfirmation","Account");
    }
    var result = await UserManager.ResetPasswordAsync(user.Id,model.Code,model.Password);
    if (result.Succeeded)
    {
        return RedirectToAction("ResetPasswordConfirmation","Account");
    }
    AddErrors(result);
    return View();
}

相关视图模型:

public class ResetPasswordViewModel
{
    public string Email { get; set; }
    public string Password { get; set; }
    public string ConfirmPassword { get; set; }
    public string Code { get; set; }
}

public class ForgotPasswordViewModel
{
    public string Email { get; set; }
}

但您需要在发送电子邮件之前配置电子邮件服务.

public class EmailService : IIdentityMessageService
{
    public Task SendAsync(IdentityMessage message)
    {
        return configSendGridasync(message);
    }

    private Task configSendGridasync(IdentityMessage message)
    {
        var myMessage = new SendGridMessage();
        myMessage.AddTo(message.Destination);
        myMessage.From = new System.Net.Mail.MailAddress(
                      "you@somewhere.com","My name");
        myMessage.Subject = message.Subject;
        myMessage.Text = message.Body;
        myMessage.Html = message.Body;

        var credentials = new NetworkCredential("userName","Password");

        // Create a Web transport for sending email.
        var transportWeb = new Web(credentials);

       // Send the email.
       if (transportWeb != null)
       {
           return transportWeb.DeliverAsync(myMessage);
       }
       else
       {
           return Task.FromResult(0);
       }
   }
}

最后,您需要在用户管理器配置器中注册此类Identity添加以下行:

public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options,IOwinContext context)
{
    var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));

    // some code here

    manager.EmailService = new EmailService();
}

请参阅Account Confirmation and Password Recovery with ASP.NET Identity (C#)作为分步教程.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读