【问题标题】:Azure Monitor Query client library - The provided credentials have insufficient access to perform the requested operation (InsufficientAccessError)Azure Monitor 查询客户端库 - 提供的凭据没有足够的访问权限来执行请求的操作 (InsufficientAccessError)
【发布时间】: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 所遵循的步骤的详细信息。 特别是,我们有:

  1. 设置一个新的Azure 广告应用程序.
  2. 为其分配所需的权限 ==>数据.读取(读取 Log Analytics 数据 - 由管理员授予)。
  3. 分配给注册应用程序(AAD 应用程序)读者角色来自 Azure 门户的 Application Insights 资源的访问控制 (IAM) 部分。
  4. 创建了一个新的客户机密对于 AAD 应用程序。
  5. 创建了一个新的 Azure网页接口,我们在女巫身上安装了Azure 监视器查询.NET 的客户端库。
  6. 为了检索日志数据,我们以编程方式实例化一个新的Azure.Identity.ClientSecretCredential对象,为其分配正确的 tenantId、AAD 应用程序的客户端(应用程序)ID 和先前为应用程序注册生成的客户端密码。
  7. 在 web api 的 Program.cs 文件中,我们创建了该类的单例实例日志查询客户端分配上面的ClientSecretCredential目的。
  8. 最后我们调用了查询工作区异步类 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


    【解决方案1】:

    提供的凭据没有足够的访问权限来执行请求的操作

    该错误清楚地表明它没有足够的访问权限来处理请求。

    为了识别新的 RBAC 权限,Azure App Insights REST API 需要一个小时才能与 AAD 同步,它会抛出状态 403作为没有完全同步的错误代码。相关内容请参考MS-DOC

    基本上,当用户无权使用 AAD 授权访问令牌时,可能会发生此错误

    1. 为您要授权的用户提供所需的访问权限。
    2. 在生产环境中处理您的 API 请求之前,请确保检查您的请求是否有效。 (令牌、GUID 等)。

    【讨论】:

      【解决方案2】:

      感谢您的帮助。 我们终于设法找出问题所在。

      在我们原始帖子中列出的第 3 点之后: <<将“分配给已注册的应用程序(AAD 应用程序)”读者角色" 用于从 Azure 门户的资源访问控制 (IAM) 部分执行的 Application Insights。>>

      ...我们省略了为日志分析工作区. 每个 Application Insight 资源实际上都指向一个特定的工作区。 因此,有必要为上述工作区的已注册应用程序分配相同的读者角色。 Log Analytics 工作区实际上也有访问控制 (IAM)Azure 门户中的部分,就像其他资源一样。

      将此角色分配给 AAD 注册的应用程序,问题已解决。

      【讨论】:

        猜你喜欢
        • 2022-01-14
        • 2022-01-07
        • 2020-03-30
        • 1970-01-01
        • 2016-08-26
        • 2019-10-28
        • 1970-01-01
        • 1970-01-01
        • 2021-09-13
        相关资源
        最近更新 更多