具有系统分配的身份失败的对存储帐户的Azure功能访问

问题描述 投票:1回答:2

我首先要提到我对Azure函数非常陌生,所以我不知道此特定服务固有的特质。我认为问题可能出在我不是以一种“功能独特”的方式看待这个问题。

我正在尝试使用系统分配的服务身份从Azure功能访问存储帐户。但是,无论我如何配置,它都会引发一个异常,指出“此请求无权使用此权限执行此操作。”

我知道我可以通过授予KeyVault访问权限并使用@ Microsoft.KeyVault来访问它,我可以在其中存储连接字符串,但是我希望能够自动旋转存储连接字符串,而不必更新以下应用程序设置我的功能。我已经看过using storage as an input binding,但是这些似乎也仍然需要使用App Setting来标识连接字符串。我只是想能够为该功能分配一个身份,这样我就不需要在应用程序设置中存储此信息。

这是我目前正在尝试的方式:

功能:

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令牌,但这似乎是一个额外的步骤,并且破坏了维护系统分配的服务标识的目的和易用性。此外,在没有进行实际设置的情况下,我不知道它是否会返回相同的错误。

感谢您可以提供的任何帮助。

azure azure-functions azure-storage
2个回答
0
投票

似乎您没有为Azure密钥保管库中的功能分配正确的权限。请按照以下步骤尝试:

  1. 转到您的天蓝色密钥库,然后单击“访问策略”->“添加访问策略。enter image description here

  2. 然后在“关键权限”,“秘密权限”和“证书权限”选择框中选择所需的权限。然后在“选择主体”框中选择您的天蓝色函数。enter image description here

希望对您的问题有所帮助〜


0
投票

Contributor仅允许您的MSI管理该存储帐户,它将不提供对该帐户中Blob数据的访问。

要解决该问题,只需将MSI(系统分配的身份)添加到具有Storage Blob Data Owner / Storage Blob Data Contributor的存储帐户中,即可正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.