当前位置: 首页 > news >正文

51.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--新增功能--登录注册扩展

在这篇文章中我们将为登录和注册的功能增加邮箱和手机号码。通过添加这些额外的验证方式,我们可以为用户提供更多的账号安全保障,同时也能让用户在忘记密码时有多种找回方式。邮箱验证将支持通过发送验证码来确认用户身份,而手机号码则可以通过短信验证的方式来进行双重认证。这些功能的加入不仅提升了系统的安全性,也为用户带来了更好的使用体验。我们将详细介绍如何在现有的登录注册系统中集成这些新特性,包括数据库设计的调整、API接口的扩展以及相关服务的实现。

Tip:发送手机验证码功能我们将在后续文章中讲解

一、修改数据库

我们先修改数据库,修改方式也很简单,打开数据库上下文类IdentityServerDbContext,将OnModelCreating方法中的b.Ignore(x => x.PhoneNumberConfirmed);删除掉,修改后的代码如下:

/// <summary>
/// 配置数据库模型
/// </summary>
/// <param name="modelBuilder"></param>
protected override void OnModelCreating(ModelBuilder modelBuilder)
{base.OnModelCreating(modelBuilder);// 配置 OpenIddictmodelBuilder.UseOpenIddict();// 修改Users表modelBuilder.Entity<SpUser>(b =>{b.Property(x => x.UserName).IsRequired().HasMaxLength(50);b.Property(x => x.Email).HasMaxLength(100);b.Property(x => x.LockoutEnd);b.Property(x => x.PasswordHash).IsRequired();b.Ignore(x => x.NormalizedUserName);b.Ignore(x => x.NormalizedEmail);b.Ignore(x => x.SecurityStamp);b.Ignore(x => x.ConcurrencyStamp);b.Ignore(x => x.TwoFactorEnabled);b.Ignore(x => x.AccessFailedCount);});SeedData(modelBuilder);
}

在我们之前的文章24.【.NET8 实战–孢子记账–从单体到微服务–转向微服务】–单体转微服务–认证微服务中,我们详细讲解了OnModelCreating方法的配置原理和具体实现。这个方法主要负责配置实体模型与数据库表之间的映射关系,包括字段的长度限制、必填项设置等重要配置。完成OnModelCreating方法的修改后,我们需要通过Entity Framework Core的迁移功能来将这些更改同步到数据库中。这个过程需要执行两个重要的命令:首先使用dotnet ef migrations add AddPhoneNumberConfirmed --context IdentityServerDbContext创建一个新的迁移文件,该文件包含了所有需要对数据库进行的修改操作;然后通过dotnet ef database update AddPhoneNumberConfirmed命令将这些修改实际应用到数据库中。这样,我们就完成了数据库结构的更新,为后续功能的开发做好了基础准备。

二、修改接口

接下来,我们需要对系统的接口层进行必要的修改和扩展,以支持新增的登录验证方式。本次修改主要涉及三个核心接口:用于处理登录认证的POST token接口、处理新用户注册的POST register接口,以及用于更新用户信息的PUT users接口。让我们以POST token接口的改造为重点,详细说明实现过程。

首先,我们需要打开认证服务的核心实现类AuthorizationServiceImpl。在这个类中,我们将重点关注LoginByPasswordAsync方法的实现。原本的代码仅支持通过用户名查找用户,现在我们需要将其扩展为支持多种登录方式。具体来说,我们需要将原来的单一查询语句SpUser? user = await _userManager.FindByNameAsync(userName);进行改造。这行代码最初的设计仅支持通过用户名进行身份验证,这显然无法满足我们对多渠道登录的需求。通过修改这段代码,我们将实现一个更加灵活和用户友好的登录系统,让用户可以选择使用自己最熟悉的方式进行身份验证。

SpUser? user =await _userManager.Users.FirstOrDefaultAsync(u =>u.PhoneNumber == userName || u.Email == userName || u.UserName == userName);

这部分代码实现了一个灵活的用户查找机制,通过使用传入的参数作为查询条件,同时匹配用户的手机号、邮箱和用户名三个字段。这种多字段匹配的设计让用户可以使用任意一种已注册的身份标识(手机号、邮箱或用户名)进行登录,大大提升了系统的用户友好性。当用户输入任意一个有效的身份标识时,系统会在数据库中搜索所有可能的匹配项,只要找到一个符合条件的用户记录,就表示该账号在系统中存在并可以进行后续的身份验证流程。

三、总结

这篇文章详细介绍了如何扩展现有的登录注册系统,通过添加邮箱和手机号码验证功能来增强用户账号的安全性和便利性。我们首先对数据库结构进行了必要的调整,启用了手机号码验证功能;然后扩展了认证接口,使系统能够支持用户通过多种方式(用户名、邮箱或手机号)进行登录。这些改进不仅提升了系统的安全性,也为用户提供了更加灵活和友好的使用体验。通过这些优化,我们的系统更好地满足了现代应用对用户认证的多样化需求。

http://www.xdnf.cn/news/1423837.html

相关文章:

  • UE角色取消被Decal影响
  • 在 PHP 应用中处理限流和 API 节流:扩展、防滥用的最佳实践
  • 【数据可视化-102】苏州大学招生计划全解析:数据可视化的五大维度
  • 预告:AI赋能IT服务管理实践 |2025 “数字化时代的IT服务管理“Meetup-深圳站(9月20日)
  • [吾爱出品] PDF文件加密解密工作,附带源码。
  • GitHub CLI (gh) 全面指南:终端中的 GitHub 工作流革命
  • ServBay 是一款集成式、图形化的本地 Web 开发环境工具,专为 macOS 和 Windows 系统设计
  • 什么是最大熵强化学习?
  • Linux笔记---计算机网络概述
  • Python上下文管理器与资源管理
  • WEEX:从某DEX代币暴涨看加密交易选择
  • 【Linux】模拟实现Shell(下)
  • 快递地址归类排序实现(Java Python)
  • 查看服务器设备是否为物理机
  • Linux内核进程管理子系统有什么第三十九回 —— 进程主结构详解(35)
  • 算法练习——169.多数元素
  • 教育项目管理工具新趋势:可视化与自动化如何提升效率?
  • XGBoost学习笔记
  • 故障排查指南:理解与解决 “No route to host“ 错误
  • 【科普向-第七篇】Git全家桶介绍:Git/Gitlab/GitHub/TortoiseGit/Sourcetree
  • std::map::try_emplace完全详解
  • 从 Oracle 到 TiDB,通过ETL工具,高效实现数据拉通
  • 并发 -- JUC(java.util.concurrent) 包的简单介绍
  • NebulaAI V2.7.0发布:MCP广场正式上线!
  • FFMPEG 10BIT下 Intel b570 qsv 硬解AV1,H265视频编码测试
  • 【项目思维】贪吃蛇(嵌入式进阶方向)
  • 光学神经网络与人工智能应用
  • 【XR技术概念科普】详解6DoF:为什么它是沉浸感的关键?
  • 贝叶斯向量自回归模型 (BVAR)
  • 【Java】Redis(中间件)