Доступ к функции Azure к учетной записи хранения с ошибкой назначенной системы - PullRequest
0 голосов
/ 09 ноября 2019

Я должен начать с упоминания, что я очень плохо знаком с функциями Azure, поэтому я не знаю особенностей, присущих данному конкретному сервису. Я думаю, что проблема, вероятно, в том, что я не смотрю на это очень «функционально».

Я пытаюсь получить доступ к учетной записи хранения из функции Azure, используя системные идентификаторы служб. Однако, независимо от того, как я его настраиваю, выдается исключение, говорящее «Этот запрос не авторизован для выполнения этой операции с использованием этого разрешения».

Я знаю, что могу получить доступ к KeyVault, предоставив ему доступ и используя @Microsoft.KeyVault, где я мог бы сохранить строку подключения, но я хочу иметь возможность автоматического поворота строки подключения к хранилищу без обновления настроек приложения для моей функции. Я видел , использующий хранилище в качестве входной привязки , но, похоже, это также требует использования настроек приложения в любом случае, идентифицирующих строку подключения. Я просто хотел воспользоваться возможностью присвоения идентификатора функции, чтобы мне не нужно было сохранять эту информацию в настройках приложения.

Вот как я сейчас пытаюсь:

Функция:

public static class Function1
    {
        [FunctionName("WebHook-Func")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");

            var azureServiceTokenProvider = new AzureServiceTokenProvider();
            string accessToken = await azureServiceTokenProvider.GetAccessTokenAsync("https://storage.azure.com/");
            TokenCredential creds = new TokenCredential(accessToken);

            log.LogInformation($"Token: {accessToken}");

            StorageCredentials storageCreds = new StorageCredentials(creds);

            try
            {
                CloudBlobClient client = new CloudBlobClient(new StorageUri(new Uri("https://<storageAccount>.blob.core.windows.net")), storageCreds);
                CloudBlobContainer container = client.GetContainerReference("fltd");
                CloudBlockBlob blob = container.GetBlockBlobReference("shopping.txt");

                string content = await blob.DownloadTextAsync();

                return (ActionResult)new OkObjectResult($"File contents: {content}");
            }catch(Exception ex)
            {
                return new BadRequestObjectResult($"Exception when calling web hook: {ex.StackTrace} {ex.Message}");
            }
        }
    }

Я включил идентификацию, назначенную системой ServiceIdentity

Я добавил это в учетную запись хранения в качестве участника: StorageAccessControl

И контейнер, к которому я пытаюсь получить доступ, существует: Blob

Однако он продолжает выдавать исключение, говорящее, что я не авторизован. Обратите внимание, что исключение происходит в DownloadTextAsync, что означает, что он может извлечь ссылку на контейнер и BLOB-объект:

Exception when calling web hook:    at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteAsyncInternal[T](RESTCommand`1 cmd, IRetryPolicy policy, OperationContext operationContext, CancellationToken token)

   at Microsoft.WindowsAzure.Storage.Blob.CloudBlob.DownloadRangeToStreamAsync(Stream target, Nullable`1 offset, Nullable`1 length, AccessCondition accessCondition, BlobRequestOptions options, OperationContext operationContext, IProgress`1 progressHandler, CancellationToken cancellationToken)

   at Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob.DownloadTextAsync(Encoding encoding, AccessCondition accessCondition, BlobRequestOptions options, OperationContext operationContext, IProgress`1 progressHandler, CancellationToken cancellationToken)

   at codeupdated.Function1.Run(HttpRequest req, ILogger log) in C:\...\webhook-func.cs:line 40 This request is not authorized to perform this operation using this permission.

Есть ли причина, по которой это не работает как есть? Я мог бы настроить учетную запись хранения для управления с помощью keyvault и запросить токены SAS, используя привязки ссылок KeyVault, но это кажется дополнительным шагом и лишает смысла цель и простоту использования сохранения идентификатора службы, назначенного системой. Кроме того, без фактической настройки я не знаю, выдаст ли она ту же ошибку.

Спасибо за любую помощь, которую вы можете предложить.

Ответы [ 2 ]

1 голос
/ 11 ноября 2019

Contributor просто разрешает MSI управлять учетной записью хранения, но не предоставляет доступа к данным BLOB-объектов в этой учетной записи.

Чтобы решить эту проблему, просто добавьте MSI (System Assigned). Удостоверение личности) к учетной записи хранения как Storage Blob Data Owner / Storage Blob Data Contributor, тогда она будет работать нормально.

1 голос
/ 11 ноября 2019

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

  1. Перейдите в хранилище ключей Azure и нажмите «Политики доступа» -> «Добавить политику доступа. enter image description here* 1007». *

  2. Затем выберите нужные разрешения в полях выбора «Разрешения ключа», «Разрешения секрета» и «Разрешения сертификата» и выберите функцию Azure в поле «Выбор участника». enter image description here

Надеюсь, это поможет вашей проблеме ~

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