详解.NET 6如何实现获取当前登录用户信息

作者:CODE4NOTHING 时间:2022-01-29 12:51:15 

需求

在前面的文章里使用.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两个claims
var claims = new List<Claim>
{
   // 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<ICurrentUserService, CurrentUserService>();

使用功能

接下来我们去修改DbContext,需要先在构造函数中注入:

TodoListDbContext.cs

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 ChangeTracker.Entries<AuditableEntity>())
   {
       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:

详解.NET 6如何实现获取当前登录用户信息

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

详解.NET 6如何实现获取当前登录用户信息

来源:https://www.cnblogs.com/code4nothing/p/15816590.html

标签:.NET6,用户,信息
0
投稿

猜你喜欢

  • Java使用二分法进行查找和排序的示例

    2023-03-16 10:16:37
  • Java实现简单猜数字小游戏

    2023-11-28 08:10:07
  • SpringBoot统一响应格式及统一异常处理

    2022-08-30 08:03:08
  • Java 如何调用long的最大值和最小值

    2021-07-24 02:27:18
  • Java求一个分数数列的前20项之和的实现代码

    2021-08-22 14:59:58
  • SpringBoot 整合mybatis+mybatis-plus的详细步骤

    2022-09-29 21:06:10
  • SpringBoot Nacos实现自动刷新

    2023-09-16 04:17:09
  • Java实现简单树结构

    2023-08-06 18:59:12
  • java emoji表情存储的解决方法

    2023-07-10 20:19:06
  • java编程abstract类和方法详解

    2023-12-15 06:08:46
  • Java sha1散列算法原理及代码实例

    2021-06-28 05:50:22
  • C#中闭包概念讲解

    2022-08-16 05:16:28
  • springboot 中整合mybatis多数据源不使用JPA

    2023-03-01 08:43:02
  • SpringBoot集成MyBatis的分页插件PageHelper实例代码

    2023-09-11 21:54:33
  • SpringBoot如何实现word文档转pdf

    2023-04-19 09:33:55
  • Java Thread.currentThread().getName() 和 this.getName()区别详解

    2021-10-31 01:46:18
  • Java八种基本变量作为类的成员变量的默认值操作

    2022-06-25 04:55:58
  • 教你如何编写简单的网络爬虫

    2023-06-01 08:58:30
  • spring boot RestTemplate 发送get请求的踩坑及解决

    2022-01-19 16:08:09
  • springboot 整合 seata的配置过程

    2023-01-13 01:28:33
  • asp之家 软件编程 m.aspxhome.com