【发布时间】: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 Contributor和CDN Endpoint Contributor,但得到了同样的异常。这很奇怪,因为它似乎列出了边缘节点可能只是一个公共端点,因为它没有绑定到任何特定的 CDN 配置文件。 -
那么其实你想做的就是使用这个api?docs.microsoft.com/en-us/rest/api/cdn/EdgeNodes/List
-
@JoyWang 没错。