使用.NET 6开发TodoList应用(填坑1)——实现当前登录用户获取
时间:2022-01-18 作者:code4nothing
系列导航及源代码
- 使用.NET 6开发TodoList应用文章索引
需求
在前面的文章里使用.NET 6开发TodoList应用(5)——领域实体创建,我们留了一个坑还没有填上,就是在数据库保存的时候,CreateUser和ModifiedUser我们当时填的都是Anonymous
,完成认证的功能后,现在我们需要实现在保存数据库的时候填入当前登陆进行操作的用户名。
目标
实现当前登陆用户信息获取。
原理和思路
原理很简单,在认证时拿到的Token里,payload中是包含登陆User的部分信息的,作为演示,我们需要想办法获取到用户名信息,并在保存数据时填入相应字段。为了获取Token中包含的用户信息,需要用到HttpContextAccessor
对象。很显然,需要一个新的接口和实现。
实现
创建当前用户获取接口
在Application/Common/Interfaces
中添加一个新的接口:
域名
namespace 域名域名rfaces;
public interface ICurrentUserService
{
string? UserName { get; }
}
这里我们取的是UserName,是因为在返回的Token中包含UserName的信息,如果需要使用UserId或其他信息,需要在GetClaims
中添加:
// 演示了返回用户名和Role两个claims
var claims = new List<Claim>
{
// Claims中包含UserName信息
new(域名, User!.UserName),
new(域名, 域名dIssuer ?? "TodoListApi"),
new(域名, 域名dAudience ?? "http://localhost:5050")
};
实现接口功能
在Api/Services
中添加类实现接口:
域名
using 域名ms;
using 域名域名rfaces;
namespace 域名ices;
public class CurrentUserService : ICurrentUserService
{
private readonly IHttpContextAccessor _httpContextAccessor;
public CurrentUserService(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
// 通过注入的IHttpContextAccessor获取`域名(ClaimsPrinciple)`中对应的Claims信息
public string? UserName => 域名Context?.域名FirstValue(域名);
}
并在Program
中添加依赖注入:
域名
域名ingleton<ICurrentUserService, CurrentUserService>();
使用功能
接下来我们去修改DbContext,需要先在构造函数中注入:
域名
private readonly ICurrentUserService _currentUserService;
public TodoListDbContext(
DbContextOptions<TodoListDbContext> options,
IDomainEventService domainEventService,
ICurrentUserService currentUserService) : base(options)
{
_domainEventService = domainEventService;
_currentUserService = currentUserService;
}
在SaveChangesAsync
方法中修改:
public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken = new())
{
foreach (var entry in 域名ies<AuditableEntity>())
{
switch (域名e)
{
case 域名d:
域名tedBy = 域名Name;
域名ted = 域名ow;
break;
case 域名fied:
域名ModifiedBy = 域名Name;
域名Modified = 域名ow;
break;
}
}
// 省略其他...
}
验证
启动Api
项目,首先获取Token,再用获取到的Token去创建一个新的TodoList:
可以看到新创建的TodoList的用户信息已经获取到了,为了确保数据存储到数据库中,我们去数据库看一下:
总结
在本文中我们实现了如何从请求中获取当前登陆的用户信息并保存到数据库中。