在ASP.NET Core中使用短信服务而不是电子邮件重置密码 [英] Reset password using SMS service instead of Email in Asp.Net Core

本文介绍了在ASP.NET Core中使用短信服务而不是电子邮件重置密码的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我要使Api终结点通过短信发送密码重置令牌。

当我们使用userManager.GeneratePasswordResetTokenAsync(user)生成令牌时,令牌是一个通常在电子邮件消息中使用的长字符串。此消息嵌入一个包含令牌作为参数的链接,并发送给用户。用户单击该链接,然后可以更改密码。

现在,我有这个问题:

  • 如何使用短信服务而不是电子邮件发送此令牌?
  • 正确且推荐的方式是使用在短信中使用UserManagerGeneratePasswordResetTokenAsync(...)创建的相同令牌,还是使用其他令牌提供商生成类似6位数字的短字符串更好?

推荐答案

请注意,GeneratePasswordResetTokenAsyncGenerateChangeEmailTokenAsync和类似方法在幕后使用GenerateUserTokenAsync(user, provider, purpose)指定的提供者和目的。

我们可以使用GenerateUserTokenAsync(user, provider, purpose)以我们想要的方式生成令牌。因此这将是我的终结点:

    [HttpPost("sendResetPasswordToken")]
    [ServiceFilter(typeof(ModelValidationFilter))]
    public async Task<IActionResult> SendChangePasswordToken([FromBody] SendChangePasswordTokenDto dto)
    {
        var user = await _userManager.FindByNameAsync(dto.UserName);
        if (user is null)
            return UnprocessableEntity("something went wrong, contact support to resolve the problem");


        var token = await _userManager.GenerateUserTokenAsync(user, TokenOptions.DefaultPhoneProvider, "ResetPasswordPurpose");
        _SMSManager.SendResetPasswordToken(token, user.PhoneNumber);
        return NoContent();
    }

我们将提供者参数设置为TokenOptions.DefaultPhoneProvider,这是默认的电话令牌提供者,并将目的参数设置为"ResetPasswordPurpose",这是一个指示令牌用途的字符串。

要验证此内标识,我们使用VerifyUserTokenAsync(user, provider, purpose, token)并提供适当的参数。下面是我的ResetPassword终结点:

    [HttpPost("resetPassword")]
    [ServiceFilter(typeof(ModelValidationFilter))]
    public async Task<IActionResult> ResetPassword([FromBody] ResetPasswordDto dto)
    {
        var user = await _userManager.FindByNameAsync(dto.SSN);

        if(user is null)
            return UnprocessableEntity("invalid user token");//actually user not found

        var tokenVerified = await _userManager.VerifyUserTokenAsync(user, TokenOptions.DefaultPhoneProvider, "ResetPasswordPurpose", dto.Token);
        if (!tokenVerified)
            return UnprocessableEntity("invalid user token");

        var token = await _userManager.GeneratePasswordResetTokenAsync(user);//new token for reseting password
        var result = await  _userManager.ResetPasswordAsync(user, token, dto.NewPassword);
        if (!result.Succeeded)
            return UnprocessableEntity("weak password");

        return NoContent();
    }

这篇关于在ASP.NET Core中使用短信服务而不是电子邮件重置密码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆