我已经在基于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
属性,但似乎没有任何作用。
答案 0 :(得分:4)
您应该使用ITelemetryInitializer来达到目的。
以下是我的测试步骤(asp.net core 2.1):
步骤1:在Aplication Insights telemetry
之前添加right click your project -> Add -> Application Insights telemetry
。屏幕截图如下:
第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步:检查测试结果:
答案 1 :(得分:0)
实际上,答案非常简单。
HttpContext ctx = ...
var requestTelemetry = ctx.Features.Get<RequestTelemetry>()
requestTelemetry.Context.User.Id = authenticationResult.UserName;