将自定义属性添加到 asp.net 核心 2 中的 ClaimsPrincipal 用户

Add Custom properties to ClaimsPrincipal user in asp.net core 2

根据标题的描述,我创建了一个 class 派生自 ClaimsPrincipal 并具有其他属性:

public class CustomeUser: ClaimsPrincipal
{
   // additional properties
}

编写了一个中间件并根据声明为其赋值:

public async Task Invoke(HttpContext context)
{
   // context to read header and assign to custome properties
   context.User = new CustomeUser() {
                         ClientIP = /*reading from claims*/,
                         UserId = /*reading from claims*/};
}

并在配置服务中添加以下行以获取 HttpContext 以在启动时从控制器获取自定义用户属性 class。

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

从控制器获取客户用户属性

public BaseController(IHttpContextAccessor httpContextAccessor)
{
   customeUser = httpContextAccessor.HttpContext.User as CustomeUser;
}

这是正确的方法吗?

如果您从控制器访问 HttpContext,则不需要 IHttpContextAccessorMicrosoft.AspNetCore.Mvc.ControllerBase class 控制器继承(通过控制器 class)的 HttpContext 属性。所以您的代码可以更改为:

public BaseController()
{
   customeUser = HttpContext.User as CustomeUser;
}

其他似乎都不错。 HttpContext.User 将包含您在 Invoke() 方法中填写的 CustomeUser 的实例,以便将讨厌的类型转换为 CustomeUser 将正常工作。