在 ASP.NET 4.x 项目中,通常使用 ClaimsPrincipal.Current 来检索当前经过身份验证的用户的标识和声明。 在 ASP.NET Core 中,不再设置此属性。 依赖于它的代码需要进行更新,以便通过不同的方式获取当前经过身份验证的用户的标识。
以特定于上下文的状态代替静态状态
使用 ASP.NET Core 时,不会设置 ClaimsPrincipal.Current
和 Thread.CurrentPrincipal
的值。 这些属性都表示静态状态,ASP.NET Core 通常会避免使用静态状态。 相反,ASP.NET Core 使用依赖项注入 (DI) 来提供依赖项,例如当前用户的标识。 从 DI 获取当前用户的标识也更易于测试,因为可以轻松注入测试标识。
在 ASP.NET Core 应用中检索当前用户
可使用以下几个选项在 ASP.NET Core 中检索当前经过身份验证的用户的 ClaimsPrincipal
,以代替 ClaimsPrincipal.Current
:
- ControllerBase.User。 MVC 控制器可以使用其 User 属性访问当前经过身份验证的用户。
- HttpContext.User。 有权访问当前
HttpContext
(例如中间件)的组件可以从HttpContext
获取当前用户的ClaimsPrincipal
。 - 从调用方传入。 无法访问当前
HttpContext
的库通常从控制器或中间件组件调用,并且可以将当前用户的标识作为参数传递。 - IHttpContextAccessor。 迁移到 ASP.NET Core 的项目可能太大,无法轻松地将当前用户的标识传递到所有必要的位置。 在这种情况下,可以使用 IHttpContextAccessor 作为解决方法。
IHttpContextAccessor
能够访问当前的HttpContext
(如果存在)。 如果使用 DI,请参阅在 ASP.NET Core 中访问 HttpContext。 若要在代码中获取当前用户的标识,但代码尚未更新,无法与 ASP.NET Core 的 DI 驱动体系结构配合使用,可使用以下短期解决方案:- 通过在
Startup.ConfigureServices
中调用IHttpContextAccessor
,使IHttpContextAccessor
在 DI 容器中可用。 - 在启动期间获取
IHttpContextAccessor
的实例并将其存储在静态变量中。 该实例可用于之前从静态属性中检索当前用户的代码。 - 使用
HttpContextAccessor.HttpContext?.User
检索当前用户的ClaimsPrincipal
。 如果在 HTTP 请求的上下文之外使用此代码,则HttpContext
为 null。
- 通过在
最后一个选项是使用存储在静态变量中的 IHttpContextAccessor
实例,这与 ASP.NET Core 优先注入依赖项而不是静态依赖项的原则相反。 该选项计划最终从 DI 检索 IHttpContextAccessor
实例。 不过,在迁移使用 ClaimsPrincipal.Current
的大型现有 ASP.NET 应用时,静态帮助程序可以起到过渡衔接的作用。