从 Core 填写应用程序见解中的用户 ID 字段 ASP.NET



我希望能够使用我的真实用户名数据填充应用程序见解中的"用户 ID"字段。 这是一个内部应用程序,因此使用简单的用户名字段的隐私问题是没有意义的。

据我所知,所有在线可用的解决方案都严格适用于.NET Framework,而不是.NET Core。

您可以在一些地方找到此解决方案,包括 GitHub 上的一些旧 AI 文档。 但是,当我运行它时,我在启动时收到一个错误,指示对作用域对象 IHttpContextAccessor 的依赖性不能从单例中接受,这当然是合乎逻辑的。 我不明白这怎么可能工作,除非以前版本的 .NET Core 的 DI 允许它(我在 2.2 上)。

GitHub上的这个问题有点说明问题,但在AI团队指出你必须使用单例之后,它被关闭了。 我尝试了OP和第一个响应中的变体,当代码运行时,AI上的User Id字段继续填充乱码数据。

有没有办法让 AI 中的用户 ID 字段填充一些对来自 ASP.NET Core 应用程序的服务器请求有用的内容?

编辑

在看到下面的答案后,我的代码应该工作得很好,我回过头来意识到异常消息没有特别提到IHttpContextAccessor:

System.InvalidOperationException:">无法使用作用域内服务 'Microsoft.ApplicationInsights.Extensibility.ITelemetryInitializer' 与辛格尔顿相比 'Microsoft.Extensions.Options.IConfigureOptions'1[Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration]'.">

现在,我的代码看起来与下面的@PeterBons答案几乎相同,所以从表面上看,这个异常毫无意义。TelemetryConfiguration事件不会出现在我的代码中。 但后来我想起我正在使用 Scrutor 懒惰地在 Startup 中进行 DI 注册:

services.Scan(scan => scan
.FromAssembliesOf(typeof(Startup), typeof(MyDbContext))
.AddClasses()
.AsSelfWithInterfaces().WithScopedLifetime());

我认为问题是我需要将我的 ITelemetryInitializer 注册为 Singleton,并且此代码无意中将其取消或重新注册为作用域。 所以我把最后两行改成了:

.AddClasses(f => f.Where(t => t != typeof(RealUserAIProvider)))
.AsSelfWithInterfaces().WithScopedLifetime());

它奏效了。 与其编辑我上面的错误,不如留下它。 @PeterBons下面的回答仍然会对其他人有所帮助,也许我对 Scrutor 的困惑也会帮助某人。

不必将HttpContextAccessor注册为作用域依赖项。只需使用单例即可。

我们在生产中使用以下命令工作:

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

结合此初始值设定项:

public class SessionDetailsTelemetryEnrichment : TelemetryInitializerBase
{
public SessionDetailsTelemetryEnrichment(IHttpContextAccessor httpContextAccessor) : base(httpContextAccessor)
{
}
protected override void OnInitializeTelemetry(HttpContext platformContext, RequestTelemetry requestTelemetry, ITelemetry telemetry)
{
telemetry.Context.User.AuthenticatedUserId =
platformContext.User?.Claims.FirstOrDefault(c => c.Type == "Username")?.Value ?? string.Empty;
}
}

最新更新