Как получить хранилище списков Azure с помощью c#?

Мне нужен список хранилища Azure из идентификатора подписки и маркера проверки подлинности.
Я делаю код согласно ссылке …

https://msdn.microsoft.com/en-us/library/azure/ee460787.aspx?f=255&MSPPError=-2147217396

Но я не могу получить эти данные, и в ответ я получаю только код 401 Unauthorized access

Я пробовал код в c#, как показано ниже —

Получить Маркер Авторизации —

private static string GetAuthorizationToken()
        {
            ClientCredential cc = new ClientCredential(ClientId, ServicePrincipalPassword);
            var context = new AuthenticationContext("https://login.windows.net/" + AzureTenantId);
            var result = context.AcquireTokenAsync("https://management.azure.com/", cc);
            if (result == null)
            {
                throw new InvalidOperationException("Failed to obtain the JWT token");
            }

            return result.Result.AccessToken;
        }

И

AuthToken = GetAuthorizationToken();
                TokenCredentials = new TokenCredentials(AuthToken);

                HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("https://management.core.windows.net/<My Subscription ID>/services/storageservices");
                request.Headers.Add(HttpRequestHeader.Authorization, "Bearer " + AuthToken);
                request.ContentType = "application/json";
                request.Method = "GET";
                //request.Headers["Authorization"] =  "Bearer " + AuthToken; // Also tried this 
                request.Headers["x-ms-version"] =  "2016-05-31";//

                //https://management.core.windows.net/<subscription-id>/services/storageservices
                //header - "x-ms-version"

                HttpWebResponse response = null;
                try
                {
                    response = (HttpWebResponse)request.GetResponse();                    
                }
                catch (WebException ex)
                {
                    //ex.Message;
                }

Пожалуйста, предложите любое решение для получения списка учетных записей хранения из идентификатора подписки и маркера аутентификации. и если у вас есть какое-то лучшее решение, другое, то это, чтобы получить список хранения, пожалуйста, предложите.

2 ответа

  1. Я использую функцию ниже для создания подобных запросов:

    private static async Task<HttpWebRequest> createHttpRequestWithToken(Uri uri)
    {
        HttpWebRequest newRequest = (HttpWebRequest)HttpWebRequest.Create(uri);
        string clientId = ConfigurationManager.AppSettings["ClientId"]);
        string clientSecret = ConfigurationManager.AppSettings["ClientSecret"]);
        ClientCredential creds = new ClientCredential(clientId, clientSecret);
        AuthenticationContext authContext = new AuthenticationContext(string.Format("https://login.microsoftonline.com/{0}/", ConfigurationManager.AppSettings["OrganizationId"]));
        AuthenticationResult authResult = await authContext.AcquireTokenAsync("https://management.core.windows.net/", creds);
        newRequest.Headers.Add(HttpRequestHeader.Authorization, "Bearer " + authResult.AccessToken);     
        return newRequest;
    }
    

    И создать запрос, как это:

    HttpWebRequest request = createHttpRequestWithToken(uri).Result;
    

    Кроме того, необходимо предоставить API управления службами Windows Azure разрешение на доступ к ресурсам. Это можно сделать на вкладке Настройка в субъекте-службе AD.

    Введите описание изображения здесь

  2. Чтобы просмотреть список всех учетных записей хранения, доступных в подписке , можно попробовать использовать:

    GET/subscriptions/{subscriptionId}/providers / Microsoft.Хранение / storageAccounts?api-версия=2016-01-01

    следующий пример кода отлично работает на моей стороне, пожалуйста, обратитесь к нему.

    string tenantId = "xxxx";
    string clientId = "xxxx";
    string clientSecret = "xxxx";
    string subscriptionid = "xxxx";
    
    string authContextURL = "https://login.windows.net/" + tenantId;
    var authenticationContext = new AuthenticationContext(authContextURL);
    var credential = new ClientCredential(clientId, clientSecret);
    var result = await authenticationContext.AcquireTokenAsync(resource: "https://management.azure.com/", clientCredential: credential);
    
    if (result == null)
    {
        throw new InvalidOperationException("Failed to obtain the JWT token");
    }
    
    string token = result.AccessToken;
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(string.Format("https://management.azure.com/subscriptions/{0}/providers/Microsoft.Storage/storageAccounts?api-version=2016-01-01", subscriptionid));
    
    request.Method = "GET";
    request.Headers["Authorization"] =  "Bearer " + token; 
    
    
    HttpWebResponse response = null;
    try
    {
        response = (HttpWebResponse)request.GetResponse();
    }
    catch (WebException ex)
    {
        //ex.Message;
    }
    

    ответ в fiddler выглядит так.

    Введите описание изображения здесь

    Кроме того , пожалуйста, убедитесь, что если вы назначаете приложение роли, если не назначить приложение роли, 403 ошибка появится.