【发布时间】:2018-10-13 00:03:31
【问题描述】:
我正在尝试在我的 .net core 2.0 web api 中使用 IHttpContextAccessor,当我访问上下文时,它始终是 WindowsPrincipal,尽管我可以清楚地看到我的身份验证配置工作正常(jwt 持有者)并且在 TokenValidated 中, HttpContext 有我的 ClaimsPrincipal 和我的声明。为什么 IHttpContextAccessor 没有使用正确的 HttpContext。它通过 DI 向服务注册,就像它应该做的那样。有人知道吗?这是在 Service Fabric 下使用 httpsys 监听器。
这里有更多信息:
此行是配置 IServiceCollection 'services' 的最后一行
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
这是在身份验证(AddJwtBearer)、授权策略、数据保护、CORS 等之后。
我正在使用带有自定义 Enrichers 的 Serilog,这些 Enrichers 使用 HttpContext 信息丰富写入日志的数据。这些丰富器使用 IHttpContextAccessor 引用进行初始化,因此它们可以调用 HttpContext 以从中获取某些信息以进行日志记录。在没有 http 上下文的情况下写入日志时,它会忽略这一点,但是当在控制器操作中写入日志时,它应该能够从上下文中获取数据。如果我设置断点并将控制器中的 HttpContext 直接与 IHttpContextAccessor 具有的 HttpContext 中的内容进行比较,它们是不同的。直接在控制器中可用的常规显示我的 ClaimPrincipal 带有声明,但 IHttpContextAccessor 显示一个没有声明的 WindowsPrincipal 但它确实具有 url 和查询字符串等。
我认为顺序可能会影响它,这就是为什么我把它放在其他项目的配置之后。
这是在 Service Fabric 服务中使用 HttpSysCommunicationListener。
【问题讨论】:
-
你能粘贴用于添加
IHttpContextAccessor单例的代码以及你是如何注入它的 -
你检查
AddAuthentication和AddSingleton的顺序了吗? -
我在上面添加了更多信息。我尝试在身份验证之前添加单例,并且认为它可能会有所不同。但结果相同。
标签: asp.net-core-2.0 azure-service-fabric