通过系统分配的身份验证失败,Azure Function对存储帐户的访问权限

时间:2019-11-09 20:54:13

标签: azure azure-functions azure-storage

我首先要提到我对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}");
            }
        }
    }

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

感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:1)

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

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

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

希望对您的问题有帮助〜

答案 1 :(得分:1)

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

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