在ASP.NET Core中使用短信服务而不是电子邮件重置密码 [英] Reset password using SMS service instead of Email in Asp.Net Core
本文介绍了在ASP.NET Core中使用短信服务而不是电子邮件重置密码的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我要使Api终结点通过短信发送密码重置令牌。
当我们使用userManager.GeneratePasswordResetTokenAsync(user)
生成令牌时,令牌是一个通常在电子邮件消息中使用的长字符串。此消息嵌入一个包含令牌作为参数的链接,并发送给用户。用户单击该链接,然后可以更改密码。
现在,我有这个问题:
- 如何使用短信服务而不是电子邮件发送此令牌?
- 正确且推荐的方式是使用在短信中使用
UserManagerGeneratePasswordResetTokenAsync(...)
创建的相同令牌,还是使用其他令牌提供商生成类似6位数字的短字符串更好?
推荐答案
请注意,GeneratePasswordResetTokenAsync
、GenerateChangeEmailTokenAsync
和类似方法在幕后使用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屋!
查看全文