Как получить токен доступа для получения метрик Azure Monitor для указанной подписки c? - PullRequest
0 голосов
/ 04 марта 2020

Нам необходимо сгенерировать токен доступа AAD, который может использоваться клиентом для запроса Azure Мониторинг метрик (хотя Fluent API) для указанной c подписки. Итак, требования следующие: 1. токен может использоваться только для запроса метрик для определенной c подписки, но не для других 2. только для запроса метрик из Azure мониторинга (через ARM, я считаю)

Как мы можем: 1. получить токен доступа? 2. Как напрямую использовать токен для Azure Management Fluent SDK?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 05 марта 2020

Позвольте мне прояснить немного больше о моих проблемах.

Служба имеет SP, у которого уже есть разрешение запрашивать ARM для ряда подписок. Теперь есть множество клиентов метрик, которые выполняют запрос метрик для каждой отдельной подписки. По соображениям безопасности эти клиенты не могут получить доступ к сервису SP; для запроса метрик предлагается следующее: для каждого отдельного клиента он может сначала запросить токен для своей подписки у службы и использовать токен для запроса метрик.

Теперь, когда служба получает запрос токена от клиента, она должна запросить у AAD токен доступа, который ограничен только соответствующей подпиской (поскольку SP имеет доступ к нескольким подпискам по умолчанию), и распространять вернуться к клиенту. Мы не хотим, чтобы клиент использовал полученный токен для запроса метрик другой подписки или для чтения ресурса, отличного от метрик.

0 голосов
/ 04 марта 2020

1. Как получить токен доступа к списку Azure метрик ресурса

a. создать участника службы и назначить роль Reader для sp. (Я использую Azure CLI для этого)

az login
az account set --subscription "<your subscription id>"
az ad sp create-for-rbac -n "readMetric" --role Reader

enter image description here

b. получить токен доступа

POST /<your sp tenant>/oauth2/token HTTP/1.1
Host: login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded

grant_type=client_credentials
&client_id=<your sp appid>
&client_secret=<your sp password>
&resource=https://management.azure.com/

c. Список метрик для одного Azure ресурса

GET https://management.azure.com/{resource id}/providers/microsoft.insights/metrics?api-version=2018-01-01&metricnames=""
Authorization : Bearer <access_token>

enter image description here

2. Для Azure Management Fluent SDK, как использовать токен напрямую?

Что касается проблемы, обратитесь к следующим шагам

static async Task Main(string[] args)
        {
       /*
           Please install sdk Microsoft.IdentityModel.Clients.ActiveDirectory and Microsoft.Azure.Management.Fluent 

      */

            var tenantId = "<your sp tenant>";
            var clientId = "<your sp appId>";
            var clientSecret = "<your sp password>";
            var subscriptionId = "<your subscription id>";
            var context = new AuthenticationContext("https://login.microsoftonline.com/" + tenantId, false);
            var credential = new ClientCredential(clientId: clientId, clientSecret: clientSecret);
            var result = await context.AcquireTokenAsync("https://management.azure.com/", credential);

            var token = result.AccessToken;
            var tokenCredentials = new TokenCredentials(token);
            var azureCredentials = new AzureCredentials(
                tokenCredentials,
                tokenCredentials,
                tenantId,
                AzureEnvironment.AzureGlobalCloud);
            var client = RestClient
                .Configure()
                .WithEnvironment(AzureEnvironment.AzureGlobalCloud)
                .WithLogLevel(HttpLoggingDelegatingHandler.Level.Basic)
                .WithCredentials(azureCredentials)
                .Build();
            var azure = Microsoft.Azure.Management.Fluent.Azure
                          .Authenticate(client, tenantId)
                          .WithSubscription(subscriptionId);
            var resourceId = "/subscriptions/e5b0fcfa-e859-43f3-8d84-5e5fe29f4c68/resourceGroups/jimtest/providers/Microsoft.Compute/virtualMachines/testvm";
            foreach (var metricDefinition in await azure.MetricDefinitions.ListByResourceAsync(resourceId))
            {
                var metricCollection = await metricDefinition.DefineQuery()
                                .StartingFrom(DateTime.UtcNow.AddMinutes(-5))
                                .EndsBefore(DateTime.UtcNow)
                                .ExecuteAsync();
                Console.WriteLine("Metrics for '" + resourceId + "':");
                Console.WriteLine("Namespacse: " + metricCollection.Namespace);
                Console.WriteLine("Query time: " + metricCollection.Timespan);
                Console.WriteLine("Time Grain: " + metricCollection.Interval);
                Console.WriteLine("Cost: " + metricCollection.Cost);
                foreach (var metric in metricCollection.Metrics)
                {
                    Console.WriteLine("\tMetric: " + metric.Name.LocalizedValue);
                    Console.WriteLine("\tType: " + metric.Type);
                    Console.WriteLine("\tUnit: " + metric.Unit);
                    Console.WriteLine("\tTime Series: ");
                    foreach (var timeElement in metric.Timeseries)
                    {
                        Console.WriteLine("\t\tMetadata: ");
                        foreach (var metadata in timeElement.Metadatavalues)
                        {
                            Console.WriteLine("\t\t\t" + metadata.Name.LocalizedValue + ": " + metadata.Value);
                        }
                        Console.WriteLine("\t\tData: ");
                        foreach (var data in timeElement.Data)
                        {
                            Console.WriteLine("\t\t\t" + data.TimeStamp
                                    + " : (Min) " + data.Minimum
                                    + " : (Max) " + data.Maximum
                                    + " : (Avg) " + data.Average
                                    + " : (Total) " + data.Total
                                    + " : (Count) " + data.Count);
                        }
                    }
                }
            }
  }

enter image description here

Подробнее см. В документе

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...