Azure中App Service的Application Insights仅显示一个用户,如何获取真实AD用户洞察?
问题原因
你看到的单一用户是Static Web App(SWA)调用App Service时使用的系统代理身份,而非终端用户的AD身份。这是因为SWA作为前端和后端之间的网关,默认会以自身的托管身份发起对App Service的请求,后端无法直接获取终端用户的身份信息,导致Application Insights(AI)只能追踪到这个代理身份,而非真实用户。
解决方法
1. 在SWA中配置传递终端用户身份到后端
SWA支持将前端已认证用户的AD身份信息通过请求头传递给后端API,操作步骤如下:
- 打开SWA的Azure门户页面,进入配置 > API
- 在身份验证设置中,勾选将用户身份传递到API选项
- 保存配置后,SWA会在转发到App Service的请求中添加
X-MS-CLIENT-PRINCIPAL-ID、X-MS-CLIENT-PRINCIPAL-NAME等请求头,携带终端用户的AD身份标识
2. 在App Service中捕获用户身份并关联到Application Insights
需要修改后端API代码,从请求头中提取用户身份信息,并将其注入到Application Insights的追踪上下文:
.NET示例
在API的中间件或过滤器中添加以下逻辑:
using Microsoft.ApplicationInsights.Extensibility; public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.Use(async (context, next) => { if (context.Request.Headers.TryGetValue("X-MS-CLIENT-PRINCIPAL-ID", out var userId)) { var telemetry = context.Features.Get<RequestTelemetry>(); if (telemetry != null) { telemetry.Context.User.Id = userId; telemetry.Context.User.AuthenticatedUserId = userId; } } await next(); }); // 其他中间件配置... }
Python/Flask示例
from flask import request from applicationinsights.requests import WSGIApplication def inject_user_telemetry(environ, start_response): user_id = request.headers.get('X-MS-CLIENT-PRINCIPAL-ID') if user_id: from applicationinsights import TelemetryClient tc = TelemetryClient() tc.context.user.id = user_id tc.context.user.authenticated_user_id = user_id return WSGIApplication(environ, start_response) app.wsgi_app = inject_user_telemetry(app.wsgi_app)
3. 验证Application Insights的用户追踪配置
确保App Service的Application Insights扩展已正确配置:
- 确认App Service已启用Application Insights,且连接字符串配置正确
- 在AI的配置 > 数据收集中,确保用户和会话选项处于开启状态
- 等待10-15分钟让AI完成数据收集和处理,之后即可在用户、会话视图中看到真实的终端用户数据,以及每个用户访问的端点、时间和来源信息
4. 排查SWA与App Service的关联问题
如果之前尝试关联SWA和App Service失败,可按以下步骤检查:
- 确保SWA和App Service位于同一Azure区域,跨区域场景需配置VNet对等
- 检查
staticwebapp.config.json中的API路由配置,确保指向App Service的正确端点,示例如下:
{ "routes": [ { "route": "/api/*", "backend": { "url": "https://your-app-service.azurewebsites.net/api/" } } ] }
- 验证App Service的访问控制:将SWA的出站IP地址添加到App Service的访问限制允许列表,或暂时关闭严格的IP限制测试
内容的提问来源于stack exchange,提问作者Ritvik Biswas
相关产品推荐
相关产品推荐

