57.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--新增功能--账户安全设置

账户安全设置是所有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中增加IsUserPhoneVerifiedAction以实现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层分别添加相应的方法,完成了查询用户手机和邮箱验证状态的功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喵叔哟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值