在身份認證後建立使用者物件ICurrentUser

ggtc發表於2024-05-01

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;
}

結果如下

相關文章