设置请求事件的用户名?

时间:2018-10-28 18:46:04

标签: asp.net-core azure-application-insights

我已经在基于ASP.NET Core Webhost的Web服务中实现了自定义身份验证方案。我想将Application Insights添加到此服务。

成功验证用户身份后,我会执行类似的操作

telemetry.Context.User.Id = authenticatedUserName;

telemetry对象是我从依赖项注入中获得的TelemetryClient

现在,问题在于用户ID没有显示在请求中,我不确定为什么。

这有效

customEvents | where user_Id != "" and name  == "MyCustomEvent"

但不是这个

request | where user_Id != ""

或这个

dependencies | where user_Id != ""

在其他地方应设置请求的用户ID吗?我宁愿不为此创建自定义事件。

我还尝试在User对象上设置HttpContext属性,但似乎没有任何作用。

2 个答案:

答案 0 :(得分:4)

您应该使用ITelemetryInitializer来达到目的。

以下是我的测试步骤(asp.net core 2.1):

步骤1:在Aplication Insights telemetry之前添加right click your project -> Add -> Application Insights telemetry。屏幕截图如下: enter image description here

第2步:添加一个实现ITelemetryInitializer的新类:

using Microsoft.ApplicationInsights.Channel;
using Microsoft.ApplicationInsights.DataContracts;
using Microsoft.ApplicationInsights.Extensibility;

namespace WebApplication33netcore
{
    public class MyTelemetryInitializer: ITelemetryInitializer
    {
        public void Initialize(ITelemetry telemetry)
        {
            var request = telemetry as RequestTelemetry;
            if (request != null)
            {
                //set the user id here with your custom value
                request.Context.User.Id = "ivan111";
            }
        }

    }
}

第3步:在Startup.cs的ConfigureServices方法中注册遥测初始化程序。有关详细信息,请参阅here

     public void ConfigureServices(IServiceCollection services)
     {
         services.Configure<CookiePolicyOptions>(options =>
         {

          options.CheckConsentNeeded = context => true;
          options.MinimumSameSitePolicy = SameSiteMode.None;
         });


         services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

         //Add the following code to register your telemetry initializer
         services.AddSingleton<ITelemetryInitializer>(new MyTelemetryInitializer());
    }

第4步:检查测试结果:

在Visual Studio中,“应用洞察”搜索: enter image description here

然后在Analytics(分析)中进行检查: enter image description here

答案 1 :(得分:0)

实际上,答案非常简单。

HttpContext ctx = ...
var requestTelemetry = ctx.Features.Get<RequestTelemetry>()

requestTelemetry.Context.User.Id = authenticationResult.UserName;