Azure App Service:以用户身份向Log Analytics认证
获取Azure App Service登录用户的Bearer令牌用于Log Analytics认证
核心思路
借助App Service的Easy Auth内置能力,获取登录用户针对Log Analytics资源的委托访问令牌,替代托管身份令牌,实现以用户身份执行查询操作。
具体步骤
1. 确认Easy Auth基础配置
确保App Service已启用Entra ID作为身份提供者,用户登录流程正常。此时Easy Auth会自动在请求头中注入用户相关令牌字段,比如X-MS-TOKEN-AAD-ID-TOKEN(ID令牌)和X-MS-TOKEN-AAD-ACCESS-TOKEN(默认访问令牌)。
2. 获取针对Log Analytics的委托令牌
默认的X-MS-TOKEN-AAD-ACCESS-TOKEN通常不包含Log Analytics的访问权限,需通过App Service内置端点获取目标资源的专用令牌:
- 调用
/.auth/me端点获取用户身份元数据,从中提取refresh_token(需确保Easy Auth配置中已开启刷新令牌颁发)。 - 调用
/.auth/refresh端点,传入resource=https://api.loganalytics.io参数,换取针对Log Analytics的访问令牌。
示例代码(ASP.NET Core环境):
var authResult = await HttpContext.AuthenticateAsync("AzureAD"); if (!authResult.Succeeded) { // 处理认证失败逻辑 return; } // 从认证上下文获取刷新令牌 var refreshToken = authResult.Properties.GetTokenValue("refresh_token"); // 构造请求获取Log Analytics专用令牌 using var httpClient = new HttpClient(); var tokenRequest = new HttpRequestMessage(HttpMethod.Post, $"{Request.Scheme}://{Request.Host}/.auth/refresh"); tokenRequest.Content = new FormUrlEncodedContent(new Dictionary<string, string> { ["resource"] = "https://api.loganalytics.io", ["refresh_token"] = refreshToken }); var tokenResponse = await httpClient.SendAsync(tokenRequest); tokenResponse.EnsureSuccessStatusCode(); var tokenData = await tokenResponse.Content.ReadFromJsonAsync<Dictionary<string, string>>(); var logAnalyticsBearerToken = tokenData["access_token"];
3. 验证权限配置
- 确认Entra ID中应用已添加Log Analytics的委托权限(如
Data.Read),并完成管理员同意(若需要)。 - 确保登录用户拥有目标Log Analytics工作区的查询权限(如
Log Analytics Reader角色)。
4. 调用Log Analytics API
将获取到的令牌放入请求头的Authorization字段,发起查询请求:
POST https://api.loganalytics.io/v1/workspaces/{你的工作区ID}/query Authorization: Bearer {logAnalyticsBearerToken} Content-Type: application/json { "query": "AzureActivity | take 10" }
内容的提问来源于stack exchange,提问作者Matthew
相关产品推荐
相关产品推荐

