账户安全设置是所有APP和网站都必不可少的核心功能,它直接关系到用户账户的安全性和可靠性。在互联网应用中,账户安全设置的实现方式多种多样,每种方式都有其特点和应用场景。比如QQ采用的密保问题方式,用户可以预先设置一些个人化的问题和答案,在需要找回密码时通过回答这些问题来验证身份;微软则采用了一次性密码代码的方案,当用户进行敏感操作时,用户输入 Authenticator APP中的密码代码来验证身份;而微信则更偏好使用扫码验证的方式,通过手机扫描电脑端的二维码来确认用户身份,这种方式既安全又便捷。这些都是目前主流应用中广泛采用的账户安全设置方案。考虑到孢子记账项目的实际需求和开发资源,我们决定采用相对简单但同样安全可靠的方案,即结合已有的短信验证码和邮箱验证码功能,构建一个轻量级的账户安全设置功能。这种方案不仅实现起来较为简单,而且由于手机号和邮箱的双重验证,也能为用户提供足够的安全保障。
一、实现查询用户手机或者邮箱是否已验证
由于发送手机验证码、邮箱验证码,以及通过手机/邮箱找回密码的功能在前面的几篇文章中已经完成了,因此我们在这里只需要增加一个简单的功能 查询用户手机或者邮箱是否已验证。这个功能很简单,根据当前登录的用户Id查询手机或者邮箱是否已经验证。
根据分析,我们需要提供连个API接口:手机是否已验证和邮箱是否已验证,同样,Service 中也需要增加两个方法:手机是否已验证和邮箱是否已验证,并且这两个方法返回bool类型。这两种验证方式的逻辑都是一样的,因此我们在这里只展示手机是否已验证的功能实现。
首先我们来看一下 Service 的实现,代码如下:
// IUserService 接口
/// <summary>
/// 查询用户手机是否已验证
/// </summary>
/// <returns></returns>
Task<bool> IsUserPhoneVerified();
// UserServiceImpl 实现类
/// <summary>
/// 查询用户手机是否已验证
/// </summary>
/// <returns></returns>
public async Task<bool> IsUserPhoneVerified()
{
var userId = _contextSession.UserId;
var user = _userManager.Users.FirstOrDefault(u => u.Id == userId);
if (user == null)
{
throw new NotFoundException("用户不存在");
}
return user.PhoneNumberConfirmed;
}
上面的代码实现了一个查询用户手机是否已验证的功能。在IUserService接口中定义了IsUserPhoneVerified方法,该方法返回一个Task类型,表示这是一个异步方法。在UserServiceImpl实现类中,具体实现了这个方法。
实现逻辑很简单:首先从_contextSession中获取当前登录用户的Id,然后使用_userManager.Users查询用户信息。如果用户不存在,则抛出NotFoundException异常。如果用户存在,则直接返回user.PhoneNumberConfirmed属性值。这个属性是ASP.NET Core Identity框架中User实体的一个内置属性,用来标识用户的手机号是否已经验证。当用户成功验证手机号后,这个属性会被设置为true。
接下来,我们在控制器UserController
中增加IsUserPhoneVerified
Action以实现API接口,代码如下:
///<summary>
/// 查询用户手机是否已验证
/// </summary>
/// <returns></returns>
[HttpGet("phone/verify")]
public async Task<ActionResult<bool>> IsUserPhoneVerified()
{
bool result = await _userService.IsUserPhoneVerified();
return Ok(result);
}
上面的代码实现了一个API接口,用于查询当前登录用户的手机号是否已验证。在UserController控制器中,我们添加了一个名为IsUserPhoneVerified的Action方法。该方法使用HTTP GET请求,路由地址为"phone/verify"。方法内部调用了_userService.IsUserPhoneVerified()服务方法来执行具体的查询逻辑,并将查询结果通过Ok方法包装后返回给客户端。这个API接口的返回值类型是ActionResult,表示返回一个布尔值,true表示手机号已验证,false表示未验证。这样,客户端就可以通过调用这个API接口来检查用户的手机号验证状态,进而在界面上展示相应的提示信息或者引导用户进行手机号验证。
二、总结
本文详细介绍了账户安全设置功能的实现过程。我们首先分析了当前主流应用中常见的账户安全设置方案,如QQ的密保问题、微软的一次性密码和微信的扫码验证等。考虑到项目实际需求和开发资源,我们选择了结合短信验证码和邮箱验证码的轻量级方案。在具体实现上,我们通过在Service层和Controller层分别添加相应的方法,完成了查询用户手机和邮箱验证状态的功能。