0

我正在使用 Microsoft.WindowsAzure.Management 和 Microsoft.IdentityModel.Clients.ActiveDirectory 包尝试从 C# 代码使用 Azure 管理 API,但是当我尝试从中检索一些数据时,我总是收到错误消息:

ForbiddenError: The server failed to authenticate the request. Verify that the certificate is valid and is associated with this subscription.

这是我正在使用的代码示例:

using Microsoft.IdentityModel.Clients.ActiveDirectory;
using Microsoft.WindowsAzure.Management;

var authContext = new Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext("https://login.windows.net/mytenant");
var cc = new Microsoft.IdentityModel.Clients.ActiveDirectory.ClientCredential("azure-app-id", "azure-app-secret");
var token = await authContext.AcquireTokenAsync("https://management.core.windows.net/", cc);

var tokenCred = new Microsoft.Azure.TokenCloudCredentials(token.AccessToken);
var client = new ManagementClient(tokenCred);
// this is where I get the error:
var subscriptions = await client.Subscriptions.GetAsync(CancellationToken.None);
4

2 回答 2

1

我相信您收到此错误是因为Service Principal(或换句话说,Azure AD 应用程序)对您的 Azure 订阅没有权限。您需要为此服务主体分配一个角色。

请参阅此链接,了解如何将 Azure 订阅中的角色分配给服务主体:https ://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-create-service- principal-portal#assign-application-to-role

一旦你这样做,错误应该消失。

于 2017-05-03T06:41:16.620 回答
0

我也可以重现这个问题。要列出订阅,我们需要使用SubscriptionClient代替ManagementClient。这是对我有用的代码:

var token = "";
var tokenCred = new Microsoft.Azure.TokenCloudCredentials(token);

var subscriptionClient = new SubscriptionClient(tokenCred);
foreach (var subscription in subscriptionClient.Subscriptions.List())
{
    Console.WriteLine(subscription.SubscriptionName);
}

注意:要使代码正常工作,我们需要使用订阅的所有者而不是证书来获取令牌。

于 2017-06-01T07:30:27.037 回答