在asp.net core 2

时间:2017-11-30 04:27:40

标签: asp.net-core asp.net-core-2.0 asp.net-core-webapi

根据标题说明,我创建了一个派生自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;
}

这是正确的做法吗?

1 个答案:

答案 0 :(得分:2)

如果您从控制器访问IHttpContextAccessor,则不需要HttpContext。控制器继承的Microsoft.AspNetCore.Mvc.ControllerBase类(通过Controller类)具有HttpContext属性。所以你的代码可以改为:

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

其余的一切似乎都很好。 HttpContext.User将包含您填入CustomeUser方法的Invoke()实例,以便将CustomeUser的讨厌类型转换为正常。