gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 23:27:16 24 4
gpt4 key购买 nike

首先我应该提到,我对 Azure 功能非常陌生,所以我不知道这个特定服务固有的特性。我认为问题可能在于我没有以非常“功能性”的方式看待这个问题。

我正在尝试使用系统分配的服务标识从 Azure Function 访问存储帐户。但是,无论我如何配置它,它都会抛出异常:“此请求无权使用此权限执行此操作。”

我知道我可以通过授予访问权限并使用 @Microsoft.KeyVault 来访问 KeyVault,我可以在其中存储连接字符串,但我希望能够自动轮换存储连接字符串,而无需更新应用设置我的职能。我见过using storage as an input binding ,但这些似乎还需要使用应用程序设置来识别连接字符串。我只是希望能够利用为函数分配身份的优势,这样我就不需要将此信息存储在应用程序设置中。

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

功能:

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 管理的存储帐户,并使用 KeyVault 引用绑定(bind)请求 SAS token ,但这似乎是一个额外的步骤,并且违背了维护系统分配的服务身份的目的和易用性。此外,如果没有实际设置,我不知道它是否会返回相同的错误。

感谢您提供的任何帮助。

最佳答案

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

要解决此问题,只需将 MSI(系统分配身份)作为 Storage Blob Data Owner/Storage Blob Data Contributor 添加到存储帐户,然后它会工作得很好。

关于Azure 函数访问存储帐户且系统分配的标识失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58783392/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com