从 ClaimsPrincipal 迁移Migrate from ClaimsPrincipal.Current
使用 ASP.NET Core 时,不会设置 和 Thread.CurrentPrincipal
的值。这些属性都表示静态状态,通常避免 ASP.NET Core。相反,ASP.NET Core 的体系结构是从特定于上下文的服务集合(使用其(DI)模型)检索依赖项(如当前用户的标识)。此外,Thread.CurrentPrincipal
是线程静态的,因此它可能不会在某些异步方案中持久保存更改(ClaimsPrincipal.Current
只是在默认情况下 Thread.CurrentPrincipal
调用)。
若要了解在异步方案中线程静态成员可能导致的问题,请考虑以下代码片段:
从应用的 DI 服务集合获取当前用户的标识也更易于测试,因为可以轻松注入测试标识。
检索当前用户在 ASP.NET Core 应用程序Retrieve the current user in an ASP.NET Core app
有几个选项可用于检索 ASP.NET Core 中当前已经过身份验证的用户的 ClaimsPrincipal
,以代替 ClaimsPrincipal.Current
:
Httpcontext.current。有权访问当前
HttpContext
(例如中间件)的组件可以从获取当前用户的ClaimsPrincipal
。-
- 通过在 中调用AddHttpContextAccessor ,使
IHttpContextAccessor
在 DI 容器中可用。 - 使用
HttpContextAccessor.HttpContext?.User
检索当前用户的ClaimsPrincipal
。如果在 HTTP 请求的上下文之外使用此代码,则HttpContext
为 null。
- 通过在 中调用AddHttpContextAccessor ,使
最后一种方法是使用存储在静态变量中的 IHttpContextAccessor
实例,这与 ASP.NET Core 原则(喜欢向静态依赖项的注入的依赖项)相反。改为计划最终从依赖关系注入检索 IHttpContextAccessor
实例。但是,在迁移以前使用 的大型现有 ASP.NET 应用时,静态帮助器可能是一个有用的桥。