当前位置: 首页 > 知识库问答 >
问题:

Azure 函数对存储帐户的访问,但系统分配的标识失败

倪炎彬
2023-03-14

首先,我应该提到我对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 令牌,但这似乎是一个额外的步骤,并且违背了维护系统分配的服务标识的目的和易用性。此外,如果没有实际设置,我不知道它是否会返回相同的错误。

感谢你能提供的任何帮助。

共有2个答案

沃盛
2023-03-14

参与者仅允许您的MSI管理存储帐户,它不会提供对该帐户中的blob数据的访问。

要解决此问题,只需将MSI(系统分配标识)添加到存储帐户作为Storage Blob Data Owner/Storage Blob数据贡献者,然后它就可以正常工作了。

江雅懿
2023-03-14

您似乎没有为azure key vault中的功能分配正确的权限。请按照以下步骤尝试一下:

希望对你的问题有帮助~

 类似资料:
  • 我正在学习本教程,其中要求使用分配给Azure存储帐户的Azure托管标识。https://docs.microsoft.com/en-us/azure/storage/common/customer-managed-keys-overview#about-客户管理的密钥 在本教程中,请参见步骤1。是: Azure Key Vault管理员向与存储帐户关联的托管标识授予加密密钥权限 但是,我找不到

  • 我正在尝试使用用户分配的标识(来自Azure容器实例)连接到Azure sql数据库。 遵循本指南:https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/tutorial-windows-vm-access-sql 它适用于系统分配的标识,但不适用于用户分配的标识。当尝试

  • 我测试了在新的Azure门户中创建经典存储帐户(manage.windowsazure.com)和“新”存储帐户。将它们设置为类似的,并运行相同的代码来创建和配置队列。但指标仅显示门户中的经典存储帐户(能够在新门户中看到这两个帐户) 我已经像这样设置了ServiceProperties,并且可以在获取服务属性或查看Azure门户时成功地看到保存的这些更改。 当我使用Microsoft Azure

  • 请帮助解决此问题。 我有两个Azure blob存储帐户store age1和storage2,如何编写一个Azure函数,一旦将任何文件上传到存储帐户,该函数就会触发。

  • 我想要实现什么 通过Azure Function连接到位于防火墙后面的Azure BLOB存储帐户。 迄今为止采取的步骤 Azure Function针对按预期工作的公共存储帐户开发和测试。 在我的Azure Function的Azure资源管理器之后,我找到出站地址(条目),并将它们添加到存储帐户的防火墙中。 问题 在尝试对具有防火墙的存储帐户运行Azure功能时,我收到一个状态:500内部服务

  • 您好,我正在创建一个新的blob触发的azure函数,我想了解函数头中“Connection=”参数的作用: 我所做的是完全删除该参数,在我将其部署到我的azure订阅后,它就可以正常工作了。因此,我想知道如果我没有使用连接参数指定任何特定帐户,该函数如何确定要使用哪个存储帐户。 这就是我部署函数的方式: