【问题标题】:What permission is required to access the ListEdgeNodes operation in the Azure REST API?访问 Azure REST API 中的 ListEdgeNodes 操作需要什么权限?
【发布时间】:2020-07-28 21:52:14
【问题描述】:

我正在尝试使用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

当我调用此方法时,我收到一个带有 Operation returned an invalid status code 'Forbidden' 消息的 ErrorResponseException。我可以毫无问题地调用 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);
}

【问题讨论】:

  • 您能否在您的门户中检查设置了哪些权限。看来您仍然无法访问它们。
  • @maxspan 谢谢你的建议。我正在使用的服务主体在订阅中具有Contributor 角色。我尝试明确添加CDN Profile ContributorCDN Endpoint Contributor,但得到了同样的异常。这很奇怪,因为它似乎列出了边缘节点可能只是一个公共端点,因为它没有绑定到任何特定的 CDN 配置文件。
  • 那么其实你想做的就是使用这个api?docs.microsoft.com/en-us/rest/api/cdn/EdgeNodes/List
  • @JoyWang 没错。

标签: c# .net azure cdn


【解决方案1】:

我最终通过将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 所以它应该在库的未来版本中按预期工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-08
    • 2015-01-26
    • 2022-06-13
    • 1970-01-01
    • 2020-01-26
    • 1970-01-01
    • 2020-03-04
    • 2018-03-13
    相关资源
    最近更新 更多