详解.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
投稿

猜你喜欢

  • Android 通过代码安装 APK的方法详解

    2022-11-12 14:37:26
  • SpringBoot+WebSocket实现即时通讯的方法详解

    2021-07-24 15:48:49
  • 详解Java分布式系统中一致性哈希算法

    2022-10-11 18:01:05
  • C#发送内置图片html格式邮件的方法

    2021-11-14 08:07:42
  • Java注解之Elasticsearch的案例详解

    2022-03-30 12:28:58
  • Java中启动线程start和run的两种方法

    2023-09-12 10:58:29
  • Android编程常用技巧实例总结

    2022-11-30 20:27:44
  • Springcloud Config配置中心使用与相关介绍

    2021-07-13 05:15:17
  • 浅谈Silverlight 跨线程的使用详解

    2021-10-16 01:23:05
  • Android仿知乎悬浮功能按钮FloatingActionButton效果

    2021-08-04 16:33:47
  • Android自定义控件实现时间轴

    2021-07-12 04:13:08
  • C#实现23种常见的设计模式的示例详解

    2022-10-19 20:28:29
  • Visual C#类的定义及实现方法实例解析

    2023-06-04 18:10:37
  • 详解Spring关于@Resource注入为null解决办法

    2023-02-13 18:14:13
  • C#实现的图片、string相互转换类分享

    2022-04-17 04:50:34
  • Java实现插入公式到PPT的示例代码

    2023-11-12 03:04:41
  • 基于java ssm springboot+mybatis酒庄内部管理系统设计和实现

    2023-09-24 23:51:17
  • Android Studio中Logcat写入和查看日志

    2021-08-05 12:37:18
  • redis实现队列的阻塞、延时、发布和订阅

    2021-07-02 10:56:19
  • 如何使用BeanUtils.copyProperties进行对象之间的属性赋值

    2023-10-17 19:01:40
  • asp之家 软件编程 m.aspxhome.com