飙血推荐
  • HTML教程
  • MySQL教程
  • JavaScript基础教程
  • php入门教程
  • JavaScript正则表达式运用
  • Excel函数教程
  • UEditor使用文档
  • AngularJS教程
  • ThinkPHP5.0教程

使用.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:

img

可以看到新创建的TodoList的用户信息已经获取到了,为了确保数据存储到数据库中,我们去数据库看一下:

img

总结

在本文中我们实现了如何从请求中获取当前登陆的用户信息并保存到数据库中。

标签:编程
湘ICP备14001474号-3  投诉建议:234161800@qq.com   部分内容来源于网络,如有侵权,请联系删除。