根据标题说明,我创建了一个派生自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
从启动类中的控制器获取该自定义用户属性。
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
从控制器获取用户属性
public BaseController(IHttpContextAccessor httpContextAccessor)
{
customeUser = httpContextAccessor.HttpContext.User as CustomeUser;
}
这是正确的做法吗?
答案 0 :(得分:2)
如果您从控制器访问IHttpContextAccessor
,则不需要HttpContext
。控制器继承的Microsoft.AspNetCore.Mvc.ControllerBase
类(通过Controller类)具有HttpContext
属性。所以你的代码可以改为:
public BaseController()
{
customeUser = HttpContext.User as CustomeUser;
}
其余的一切似乎都很好。 HttpContext.User
将包含您填入CustomeUser
方法的Invoke()
实例,以便将CustomeUser
的讨厌类型转换为正常。