如何使用.Net API中的托管身份连接Azure日志分析工作区

n8ghc7c1  于 2023-10-22  发布在  .NET
关注(0)|答案(1)|浏览(111)

有一个解决方法是使用Azure Active Directory应用程序权限从c#连接Azure日志分析工作区。但是,是否可以通过托管身份而不是使用Active Directory来实现同样的目标。
参考:https://techcommunity.microsoft.com/t5/microsoft-sentinel-blog/access-azure-sentinel-log-analytics-via-api-part-1/ba-p/1248377 .

ca1c2owp

ca1c2owp1#

我创建了一个用户名管理身份

已使用以下PowerShell脚本授予Log Analytics API权限

Connect-AzureAD

$TenantID="TenantID"
$LogAppId = "ca7f3f0b-7d91-482c-8e09-c5d840d0eac5" --> Dont change this value
$NameOfMSI="testrukMI"
$PermissionName = "Data.Read"

$MSI = (Get-AzureADServicePrincipal -Filter "displayName eq '$NameOfMSI'")
Start-Sleep -Seconds 10
$LogServicePrincipal = Get-AzureADServicePrincipal -Filter "appId eq '$LogAppId'"
$AppRole = $LogServicePrincipal.AppRoles | 
Where-Object {$_.Value -eq $PermissionName -and $_.AllowedMemberTypes -contains "Application"}

New-AzureAdServiceAppRoleAssignment -ObjectId $MSI.ObjectId -PrincipalId $MSI.ObjectId -ResourceId $LogServicePrincipal.ObjectId -Id $AppRole.Id

检查API权限是否分配给托管身份,如下所示:

  • 转到企业应用程序->搜索您的托管身份->登录 *

我为托管身份分配了日志分析读取器角色

现在使用以下代码生成访问令牌

using System;
using Azure.Identity;
using Azure.Core;

class Program
{
    static async Task Main(string[] args)
    {
        string clientId = "XXXXXXXX"; // The Client ID of the user assigned identity

        AccessToken token = await new DefaultAzureCredential(
            new DefaultAzureCredentialOptions
            {
                ManagedIdentityClientId = clientId
            })
            .GetTokenAsync(
                new TokenRequestContext(
                    new[] { "https://westus2.api.loganalytics.io/.default" }
                ));

        Console.WriteLine(token.Token);
    }
}

  • 解码访问令牌:*

使用上面生成的访问令牌,我能够成功访问日志分析工作区

https://api.loganalytics.io/v1/workspaces/WorkSpaceID/query

相关问题