在身份认证后建立用户对象ICurrentUser

app.UseAuthentication();

这个中间件添加后,他会为HttpContext.User设置一个ClaimsPrincipal对象。里面有身份认证token里面携带的信息。

其访问方式如下

HttpContext.User.FindFirstValue("自定义字段")

我们可以创建一个服务,方便在应用中使用用户信息。

因为在服务中拿不到HttpContext,所以只能通过IHttpContextAccessor去拿HttpContext

HttpContextAccessor.HttpContext

但是IHttpContextAccessor也需要先注入到容器中,服务才能使用

builder.Services.AddHttpContextAccessor();

完成IHttpContextAccessor注入后,就可以创建一个用户信息服务

 1 public interface ICurrentUser
 2 {
 3     string depart { get; }
 4     string 自定义字段 { get; }
 5     string 自定义字段2 { get; }
 6 }
 7 
 8 public class CurrentUser : ICurrentUser
 9 {
10     //服务中拿不到HttpContext,只能通过IHttpContextAccessor去拿到服务中拿不到HTTPContext
11     public CurrentUser(IHttpContextAccessor httpContextAccessor)
12     {
13         HttpContextAccessor = httpContextAccessor;
14     }
15 
16     private IHttpContextAccessor HttpContextAccessor { get; }
17     public string depart => HttpContextAccessor.HttpContext.User.FindFirstValue("testdepart");//=>只读初始化器语法糖
18     public string 自定义字段 => HttpContextAccessor.HttpContext.User.FindFirstValue("自定义字段");
19     public string 自定义字段2 => HttpContextAccessor.HttpContext.User.FindFirstValue("自定义字段2");
20 }

然后在容器中注入这个服务

builder.Services.AddScoped<ICurrentUser,CurrentUser>();

在控制器或其他服务中使用就通过构造注入就行

public WeatherForecastController(ICurrentUser currentUser)
{
    CurrentUser = currentUser;
}

我们在一个接口中返回这个对象

[HttpGet]
public object GetCurrent()
{
    return CurrentUser;
}

结果如下

 

posted @ 2024-05-01 11:02  ggtc  阅读(46)  评论(0)    收藏  举报
//右下角目录