Я должен начать с упоминания, что я очень плохо знаком с функциями 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}");
}
}
}
Я включил идентификацию, назначенную системой
Я добавил это в учетную запись хранения в качестве участника:
И контейнер, к которому я пытаюсь получить доступ, существует:
Однако он продолжает выдавать исключение, говорящее, что я не авторизован. Обратите внимание, что исключение происходит в 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, но это кажется дополнительным шагом и лишает смысла цель и простоту использования сохранения идентификатора службы, назначенного системой. Кроме того, без фактической настройки я не знаю, выдаст ли она ту же ошибку.
Спасибо за любую помощь, которую вы можете предложить.