首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从ASP.NET内核填充应用程序内部的用户Id字段

从ASP.NET内核填充应用程序内部的用户Id字段
EN

Stack Overflow用户
提问于 2019-07-10 22:31:52
回答 1查看 1.9K关注 0票数 3

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

据我所知,所有在线可用的解决方案都严格地在.NET框架中工作,而不是.NET核心。

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

GitHub上的这个问题说出了这个问题,但在AI小组指出你必须使用单例之后,它就被关闭了。我尝试了OP和第一个响应中的变化,当代码运行时,AI上的用户Id字段继续充斥着乱七八糟的数据。

有什么方法可以让AI中的用户Id字段充满来自ASP.NET核心应用程序的服务器请求的有用信息?

编辑

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

System.InvalidOperationException:‘不能从单例'Microsoft.Extensions.Options.IConfigureOptions`1Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration'.’中使用作用域服务'Microsoft.ApplicationInsights.Extensibility.ITelemetryInitializer‘

现在,我的代码看起来与下面@PeterBons的答案差不多,所以从表面上看,这个异常是没有意义的。TelemetryConfiguration不会出现在我的代码中。但后来我想起我正在使用Scrutor懒洋洋地在启动时进行DI注册:

代码语言:javascript
复制
    services.Scan(scan => scan
        .FromAssembliesOf(typeof(Startup), typeof(MyDbContext))
        .AddClasses()
        .AsSelfWithInterfaces().WithScopedLifetime());

我认为问题在于我需要将我的ITelemetryInitializer注册为Singleton,而这段代码无意中取消了或者重新注册了它的作用域。所以我把最后两行改为:

代码语言:javascript
复制
        .AddClasses(f => f.Where(t => t != typeof(RealUserAIProvider)))
        .AsSelfWithInterfaces().WithScopedLifetime());

而且起作用了。与其把上面的错误删掉,我还是把它留下。@PeterBons在下面的回答仍然会对其他人有所帮助,也许我对Scrutor的困惑也会对别人有所帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-11 05:53:33

您不必将HttpContextAccessor注册为一个作用域依赖项。就用一个单身的。

我们在生产中使用这样的方法:

代码语言:javascript
复制
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

与此初始化器相结合:

代码语言:javascript
复制
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;

    }
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56979452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档