Ошибка локальной отладочной аутентификации Azure Managed Identity - PullRequest
1 голос
/ 08 июля 2019

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

StorageException: серверу не удалось аутентифицировать запрос. Удостовериться Значение заголовка Авторизация сформировано правильно, включая подпись.

using Microsoft.Azure.Services.AppAuthentication;
using Microsoft.WindowsAzure.Storage.Auth;
using Microsoft.WindowsAzure.Storage.Blob;
using System;
using System.Threading;
using System.Threading.Tasks;

namespace testmsistorageaccess
{
    class Program
    {
        public static void Main()
        {
            AzureServiceTokenProvider azureServiceTokenProvider = new AzureServiceTokenProvider();
            var tokenAndFrequency = TokenRenewerAsync(azureServiceTokenProvider,
                                                        CancellationToken.None).GetAwaiter().GetResult();

            TokenCredential tokenCredential = new TokenCredential(tokenAndFrequency.Token,
                                                                    TokenRenewerAsync,
                                                                    azureServiceTokenProvider,
                                                                    tokenAndFrequency.Frequency.Value);

            StorageCredentials storageCredentials = new StorageCredentials(tokenCredential);

            var storageUri = new Uri("https://mystorageaccount.blob.core.windows.net");
            var client = new CloudBlobClient(storageUri, storageCredentials);
            var container = client.GetContainerReference("bob");
            string content = container.GetBlockBlobReference("bob.xml").DownloadTextAsync().Result;
            Console.WriteLine($"Got {content}");
        }

        private static async Task<NewTokenAndFrequency> TokenRenewerAsync(Object state, CancellationToken cancellationToken)
        {
            const string StorageResource = "https://storage.azure.com/";
            var authResult = await ((AzureServiceTokenProvider)state).GetAuthenticationResultAsync(StorageResource);
            var next = (authResult.ExpiresOn - DateTimeOffset.UtcNow) - TimeSpan.FromMinutes(5);
            if (next.Ticks < 0)
            {
                next = default(TimeSpan);
            }
            return new NewTokenAndFrequency(authResult.AccessToken, next);
        }
    }
}

Не уверен, что я делаю здесь не так, я проверил и пользователя, которого он пытается использовать, и это выглядит правильно и имеет правильный AD Tenant ID:

enter image description here

Я видел упоминание о проверке времени на моем локальном компьютере с помощью UTCNow и подтвердил, что оно правильно с временем по Гринвичу, кроме того, что я больше ничего не нашел о том, как его отладить.

Любая помощь приветствуется

1 Ответ

2 голосов
/ 08 июля 2019

Владелец подписки! = Доступ к данным.Вам нужно добавить роль участника хранилища BLOB-объектов или читателя BLOB-объектов хранилища.

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