C# 获取控制器外部的当前用户

C# 获取控制器外部的当前用户,c#,asp.net-core,asp.net-core-2.2,C#,Asp.net Core,Asp.net Core 2.2,在ASP.NET Core 2.2控制器上,我具有以下功能: var principal = this.User as ClaimsPrincipal; var authenticated = this.User.Identity.IsAuthenticated; var claims = this.User.Identities.FirstOrDefault().Claims; var id = this.User.FindFirstValue(ClaimTypes.NameIdenti

在ASP.NET Core 2.2控制器上,我具有以下功能:

var principal = this.User as ClaimsPrincipal;

var authenticated = this.User.Identity.IsAuthenticated;

var claims = this.User.Identities.FirstOrDefault().Claims;

var id = this.User.FindFirstValue(ClaimTypes.NameIdentifier);
我能够检查用户是否通过了
身份验证
,并获取
声明
,包括
id


控制器
之外,如果我没有
this.User
,如何在该控制器之外执行相同操作?

IHttpContextAccessor
接口注入目标类。这将通过
HttpContext

这提供了一个机会,通过创建一个服务来抽象此功能,以提供您想要的信息(即当前登录的用户)

您现在需要在
启动中设置
IHttpContextAccessor
。ConfigureServices
以便能够插入它:

services.AddHttpContextAccessor();
services.AddTransient<IUserService, UserService>();
services.AddHttpContextAccessor();
services.AddTransient();
并在需要时注入您的服务


需要注意的是,
HttpContext
可以为空。只是因为 您有
IHttpContextAccessor
,但这并不意味着您要 实际上,您总是能够获得
HttpContext
。重要的是,代码在哪里 您正在使用它,它必须以某种方式在请求管道中,或者
HttpContext
将为空


通过注释贷记

需要注意的是,
HttpContext
可以为空。仅仅因为您有
IHttpContextAccessor
,并不意味着您将能够实际获取
HttpContext
。重要的是,您使用它的代码必须以某种方式位于请求管道中,否则
HttpContext
将为空需要吗
IHttpContextAccessor
需要它,但
AddHttpContextAccessor()
不添加它?
services.AddHttpContextAccessor();
services.AddTransient<IUserService, UserService>();