根据标题的描述,我创建了一个从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;
}
这是一种正确的方法吗?
如果您从控制器访问HttpContext
,则不需要IHttpContextAccessor
。 控制器从中继承(通过控制器类)Microsoft.AspNetCore.Mvc.ControllerBase
类具有HttpContext
属性。因此,您的代码可以更改为:
public BaseController()
{
customeUser = HttpContext.User as CustomeUser;
}
其余的似乎都很好。HttpContext.User
将包含您在该方法中填写Invoke()
CustomeUser
的实例,以便讨厌的类型转换为CustomeUser
就可以正常工作。