在 Azure REST API 中访问 ListEdgeNodes 操作需要什么权限?

What permission is required to access the ListEdgeNodes operation in the Azure REST API?

我正在尝试使用 Azure SDK for .NET 获取 CDN 边缘节点的 IP 地址列表。我使用以下 Azure CLI 命令创建了一个服务主体:

az ad sp create-for-rbac --sdk-auth

我的代码如下所示:

var creds = SdkContext
    .AzureCredentialsFactory
    .FromServicePrincipal(
        "[client-id]", 
        "[client-secret]", 
        "[tenant-id]", 
        AzureEnvironment.AzureGlobalCloud);
            
var azure = Azure
    .Configure()
    .Authenticate(creds)
    .WithDefaultSubscription();
        
var edgeNodes = azure.CdnProfiles.ListEdgeNodes();

// ... do other things

当我调用这个方法时,我得到一个 ErrorResponseExceptionOperation returned an invalid status code 'Forbidden' 的消息。我可以毫无问题地调用 CdnProfiles 对象上的所有其他方法。

关于我需要授予服务主体什么权限才能访问此端点有什么想法吗?

谢谢!

编辑:

我认为这可能是一个错误。以下代码工作正常,使用相同的服务主体:

async Task Main()
{
    var clientId = "[client-id]";
    var clientSecret = "[client-secret]";
    var tenantId = "[tenant-id]";
    var tenantDomainName = "[tenant-domain-name]";
    var subscriptionId = "[subscription-id]";
    var authority = $"https://login.microsoftonline.com/{tenantId}/{tenantDomainName}";

    var authResult = await GetAccessTokenAsync(clientId, clientSecret, authority);

    var cdn = new CdnManagementClient(new TokenCredentials(authResult.AccessToken))
        { SubscriptionId = subscriptionId };

    var edgeNodes = await cdn.EdgeNodes.ListAsync();
}

private static Task<AuthenticationResult> GetAccessTokenAsync(string clientId, string clientSecret, string authority)
{
    var authContext = new AuthenticationContext(authority);
    var credential = new ClientCredential(clientId, clientSecret);
    return authContext.AcquireTokenAsync("https://management.core.windows.net/", credential);
}

我现在通过将 Microsoft.Azure.Management.Cdn 升级到 5.0.0-preview 并使用 CdnManagementClient.

解决了这个问题
var creds = SdkContext
    .AzureCredentialsFactory
    .FromServicePrincipal(
        "[client-id]", 
        "[client-secret]", 
        "[tenant-id]", 
        AzureEnvironment.AzureGlobalCloud);
    
var client = new Microsoft.Azure.Management.Cdn.CdnManagementClient(creds);

var edgeNodes = client.EdgeNodes.List();

// ... do other things

此代码按预期工作。我仍然认为这是一个错误,所以我创建了一个 Github issue 如果将来有人遇到这个问题。

编辑:

这确实是一个错误。 A fix was merged 所以它应该在库的未来版本中按预期工作。