详解.NET|详解.NET 6如何实现获取当前登录用户信息
目录
- 需求
- 目标
- 原理和思路
- 实现
- 创建当前用户获取接口
- 实现接口功能
- 使用功能
- 验证
- 总结
需求 在前面的文章里使用.NET 6开发TodoList应用之领域实体创建原理和思路,我们留了一个坑还没有填上,就是在数据库保存的时候,CreateUser和ModifiedUser我们当时填的都是
Anonymous
,完成认证的功能后,现在我们需要实现在保存数据库的时候填入当前登陆进行操作的用户名。目标 实现当前登陆用户信息获取。
原理和思路 原理很简单,在认证时拿到的Token里,payload中是包含登陆User的部分信息的,作为演示,我们需要想办法获取到用户名信息,并在保存数据时填入相应字段。为了获取Token中包含的用户信息,需要用到
HttpContextAccessor
对象。很显然,需要一个新的接口和实现。实现
创建当前用户获取接口
在
Application/Common/Interfaces
中添加一个新的接口:ICurrentUserService.cs
namespace TodoList.Application.Common.Interfaces; public interface ICurrentUserService{string? UserName { get; }}
这里我们取的是UserName,是因为在返回的Token中包含UserName的信息,如果需要使用UserId或其他信息,需要在
GetClaims
中添加:// 演示了返回用户名和Role两个claimsvar claims = new List{// Claims中包含UserName信息new(ClaimTypes.Name, User!.UserName),new(JwtRegisteredClaimNames.Iss, _jwtConfiguration.ValidIssuer ?? "TodoListApi"),new(JwtRegisteredClaimNames.Aud, _jwtConfiguration.ValidAudience ?? "http://localhost:5050")};
实现接口功能
在
Api/Services
中添加类实现接口:CurrentUserService.cs
using System.Security.Claims; using TodoList.Application.Common.Interfaces; namespace TodoList.Api.Services; public class CurrentUserService : ICurrentUserService{private readonly IHttpContextAccessor _httpContextAccessor; public CurrentUserService(IHttpContextAccessor httpContextAccessor){_httpContextAccessor = httpContextAccessor; }// 通过注入的IHttpContextAccessor获取`HttpContext.User(ClaimsPrinciple)`中对应的Claims信息public string? UserName=> _httpContextAccessor.HttpContext?.User.FindFirstValue(ClaimTypes.Name); }
并在
Program
中添加依赖注入:Program.cs
builder.Services.AddSingleton();
使用功能
接下来我们去修改DbContext,需要先在构造函数中注入:
TodoListDbContext.cs
private readonly ICurrentUserService _currentUserService; public TodoListDbContext(DbContextOptionsoptions,IDomainEventService domainEventService,ICurrentUserService currentUserService) : base(options){_domainEventService = domainEventService; _currentUserService = currentUserService; }
在
SaveChangesAsync
方法中修改:public override async TaskSaveChangesAsync(CancellationToken cancellationToken = new()){foreach (var entry in ChangeTracker.Entries()){switch (entry.State){case EntityState.Added:entry.Entity.CreatedBy = _currentUserService.UserName; entry.Entity.Created = DateTime.UtcNow; break; case EntityState.Modified:entry.Entity.LastModifiedBy = _currentUserService.UserName; entry.Entity.LastModified = DateTime.UtcNow; break; }}// 省略其他...}
验证 启动
Api
项目,首先获取Token,再用获取到的Token去创建一个新的TodoList:文章图片
可以看到新创建的TodoList的用户信息已经获取到了,为了确保数据存储到数据库中,我们去数据库看一下:
文章图片
总结 在本文中我们实现了如何从请求中获取当前登陆的用户信息并保存到数据库中。
【详解.NET|详解.NET 6如何实现获取当前登录用户信息】到此这篇关于详解.NET 6如何实现获取当前登录用户信息的文章就介绍到这了,更多相关.NET 6获取当前登录用户信息内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- Redis|Redis 中的 set 和 sorted set 如何使用,源码实现分析
- 机器学习实战 | LightGBM建模应用详解
- 机器学习实战 | XGBoost建模应用详解
- android|走穿java23种设计模式-2工厂方法模式详解
- Android面试题集-常见几个面试题详解
- .NET异步编程模式的三种类型介绍
- ASP.NET|ASP.NET Core项目中调用WebService的方法
- 解锁一个新技能,如何在Python代码中使用表情包...
- 一文读懂丨国产化大背景下,企业如何稳固数据底座()
- 揭秘.NET|揭秘.NET Core剪裁器背后的技术