将自定义属性添加到 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
,则不需要 IHttpContextAccessor
。 Microsoft.AspNetCore.Mvc.ControllerBase
class 控制器继承(通过控制器 class)的 HttpContext
属性。所以您的代码可以更改为:
public BaseController()
{
customeUser = HttpContext.User as CustomeUser;
}
其他似乎都不错。 HttpContext.User
将包含您在 Invoke()
方法中填写的 CustomeUser
的实例,以便将讨厌的类型转换为 CustomeUser
将正常工作。
根据标题的描述,我创建了一个 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
,则不需要 IHttpContextAccessor
。 Microsoft.AspNetCore.Mvc.ControllerBase
class 控制器继承(通过控制器 class)的 HttpContext
属性。所以您的代码可以更改为:
public BaseController()
{
customeUser = HttpContext.User as CustomeUser;
}
其他似乎都不错。 HttpContext.User
将包含您在 Invoke()
方法中填写的 CustomeUser
的实例,以便将讨厌的类型转换为 CustomeUser
将正常工作。