【发布时间】:2022-11-17 07:53:03
【问题描述】:
为了以编程方式检索一些AppTraces和应用异常来自 Azure 的信息应用洞察日志资源,我们按照以下文章中的说明采用新的Azure 监视器查询.NET 的客户端库来实现这个目的。
https://learn.microsoft.com/it-it/dotnet/api/overview/azure/Monitor.Query-readme?view=azure-dotnet
严格按照上述文章说明(并使用默认 AzureCredential对象进行身份验证),我们设法获得了客户端库的日志查询客户端对象在开发的 web api (ASP .NET Core 6.0) 的本地版本中运行良好。因此,我们可以在本地获取所需的日志信息。 但是一旦我们在云上发布了 web api(在 Application Insights 目标资源的相同 Azure 订阅下),我们开始出现以下错误:
- 信息: 提供的凭据没有足够的访问权限来执行请求的操作
- 地位:403(禁止)
- 错误代码: 访问不足错误
注意令人惊讶的是,我们没有找到任何线程来解释如何通过具体参考新的 Azure Monitor Query 客户端库来逐步解决问题。
为了解决这个问题,我们尝试更换课程默认 AzureCredential与班级ClientSecretCredential生成并分配给它一个新的客户端密码。
以下是有关我们实施 ClientSecretCredentials 所遵循的步骤的详细信息。 特别是,我们有:
- 设置一个新的Azure 广告应用程序.
- 为其分配所需的权限 ==>数据.读取(读取 Log Analytics 数据 - 由管理员授予)。
- 分配给注册应用程序(AAD 应用程序)读者角色来自 Azure 门户的 Application Insights 资源的访问控制 (IAM) 部分。
- 创建了一个新的客户机密对于 AAD 应用程序。
- 创建了一个新的 Azure网页接口,我们在女巫身上安装了Azure 监视器查询.NET 的客户端库。
- 为了检索日志数据,我们以编程方式实例化一个新的Azure.Identity.ClientSecretCredential对象,为其分配正确的 tenantId、AAD 应用程序的客户端(应用程序)ID 和先前为应用程序注册生成的客户端密码。
- 在 web api 的 Program.cs 文件中,我们创建了该类的单例实例日志查询客户端分配上面的ClientSecretCredential目的。
- 最后我们调用了查询工作区异步类 LogsQueryClient 的方法,将其传递给工作区编号Application Insights 资源(必须读取其日志)和要检索的查询。
不幸的是,用 ClientSecretCredential 替换类 DefaultAzureCredential 不起作用,错误消息保持不变。
注意
- 的AAD 用户类型开发和发布 web api、注册新的 Azure AD 应用程序并授予其必要权限的用户是“成员”。
- 上述用户,指的是与他在上述步骤中管理的资源(Web Api、AAD 应用程序等)相同的租户 ID。
- 在 web api 的发布过程中,发布应用程序的同一用户专门创建了一个新的 API 管理服务。
这是代码sn-ps:
程序.cs
builder.Services.AddAzureClients(builder => { static LogsQueryClient func(LogsQueryClientOptions options) { options.Retry.Mode = Azure.Core.RetryMode.Exponential; options.Retry.MaxRetries = 5; var csc = new ClientSecretCredential(tenantId, clientId, clientSecret); return new LogsQueryClient(csc, options); } builder.AddClient<LogsQueryClient, LogsQueryClientOptions>(func); var credentials = new ClientSecretCredential(tenantId, clientId, clientSecret); builder.UseCredential(credentials); });控制器.cs(得到日志查询客户端通过依赖注入)
Response<LogsQueryResult> response = await logsQueryClient.QueryWorkspaceAsync(workSpaceId, query);
【问题讨论】:
标签: azure-application-insights azure-log-analytics azure-monitoring defaultazurecredential