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; }
結果如下