Azure 无法从本地环境将blob存储上载/下载到容器

Azure 无法从本地环境将blob存储上载/下载到容器,azure,azure-functions,azure-blob-storage,application-settings,Azure,Azure Functions,Azure Blob Storage,Application Settings,我有一个退出的功能应用程序,它可以从sftp下载文件,处理文件并将文件上载到blob存储。此功能应用程序已部署在azure中,并且工作正常。然而,当我从VisualStudio(本地)运行相同的东西时,我在将文件上载到blob存储时出错 Microsoft.Azure.Storage.StorageException:未授权此请求使用此权限执行此操作 我确保此应用程序在存储帐户中分配了必要的参与者角色(这就是为什么它在azure中工作)。我是否需要在本地设置或项目设置中配置其他设置,以使这些功能

我有一个退出的功能应用程序,它可以从sftp下载文件,处理文件并将文件上载到blob存储。此功能应用程序已部署在azure中,并且工作正常。然而,当我从VisualStudio(本地)运行相同的东西时,我在将文件上载到blob存储时出错

Microsoft.Azure.Storage.StorageException:未授权此请求使用此权限执行此操作

我确保此应用程序在存储帐户中分配了必要的参与者角色(这就是为什么它在azure中工作)。我是否需要在本地设置或项目设置中配置其他设置,以使这些功能与部署到azure时一样工作?或者,当从dev运行但仅从azure运行时,存储帐户中是否存在覆盖以执行上载操作的任何设置

我确保我使用的本地设置都是从应用程序配置中复制的,该配置包含存储帐户名、blob存储的连接字符串、sftp url和包含sft站点详细信息的密钥库名称等

更新: 忘记提到az storage container upload命令从命令行从我的机器成功上传文件

更新2: 按照的建议,我遵循了,并且我成功地创建了容器,上传了blob,并且没有错误地进行了清理。 然后,我整合代码,将简单的下载blob模拟到内存流中,这也会引发错误

此请求无权使用此命令执行此操作 许可 (参见底部的完整日志)

下载blob的代码:

static async Task TokenCredentialsSample()
{
    var tenantId = "xxxxx-xxxx-xxxx-xxxx-xxxxxxxx";
    var tokenProvider = new AzureServiceTokenProvider().GetAccessTokenAsync("https://storage.azure.com/",tenantId);
    var tokenCredential = new TokenCredential(tokenProvider.Result);
    var storageCredentials = new StorageCredentials(tokenCredential);
    var uri = new Uri("https://mystorageaccount.blob.core.windows.net/mycontainer/inbound/myfile.csv");

    var cloudBlockBlob = new CloudBlockBlob(uri, storageCredentials);

    var memoryStream = new MemoryStream();

    cloudBlockBlob.DownloadToStream(memoryStream); // Error here
    memoryStream.Position = 0;
    memoryStream.Close();

}
我还确保从命令行键入az login以切换到选择正确的订阅,并且在VisualStudio选项中选择了该帐户

错误日志:

static async Task TokenCredentialsSample()
{
    var tenantId = "xxxxx-xxxx-xxxx-xxxx-xxxxxxxx";
    var tokenProvider = new AzureServiceTokenProvider().GetAccessTokenAsync("https://storage.azure.com/",tenantId);
    var tokenCredential = new TokenCredential(tokenProvider.Result);
    var storageCredentials = new StorageCredentials(tokenCredential);
    var uri = new Uri("https://mystorageaccount.blob.core.windows.net/mycontainer/inbound/myfile.csv");

    var cloudBlockBlob = new CloudBlockBlob(uri, storageCredentials);

    var memoryStream = new MemoryStream();

    cloudBlockBlob.DownloadToStream(memoryStream); // Error here
    memoryStream.Position = 0;
    memoryStream.Close();

}
Microsoft.Azure.Storage.StorageException HResult=0x80131500 Message=未授权此请求使用此权限执行此操作。 Source=Microsoft.Azure.Storage.Common 堆栈跟踪: 在Microsoft.Azure.Storage.Core.Executor.Executor.d_u1
1.MoveNext()中
在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()中
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
at System.Runtime.CompilerServices.TaskAwaiter
1.GetResult() 在Microsoft.Azure.Storage.Core.Executor.Executor.c__DisplayClass0_0
1.b_0()
位于Microsoft.Azure.Storage.Core.Util.CommonUtility.RunWithoutSynchronizationContext[T](Func
1 actionToRun) 在Microsoft.Azure.Storage.Core.Executor.Executor.ExecuteSync[T](RESTCommand
1 cmd,IRetryPolicy策略,OperationContext OperationContext)
在Microsoft.Azure.Storage.Blob.CloudBlob.DownloadRangeToStream(流目标,可空
1偏移量,可空`1长度,AccessCondition AccessCondition,BlobrequesToOptions,OperationContext OperationContext) 在Microsoft.Azure.Storage.Blob.CloudBlob.DownloadToStream(流目标、AccessCondition AccessCondition、BlobRequestStoptions选项、OperationContext OperationContext) 在c:…\source\repos\BlobStorage\Program.d\uu 2.MoveNext()中的BlobStorage.Program.d\uu 2.MoveNext()处:第111行 在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()中 at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) 在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中 在System.Runtime.CompilerServices.TaskAwaiter.GetResult()中 在c:…\source\repos\BlobStorage\Program.d\uu 0.MoveNext()中的BlobStorage.Program.d\uu 0.MoveNext()处:第19行

此异常最初是在此调用堆栈中引发的: Microsoft.Azure.Storage.Core.Executor.Executor.ExecuteAsync(Microsoft.Azure.Storage.Core.Executor.RESTCommand,Microsoft.Azure.Storage.RetryPolicys.IRetryPolicy,Microsoft.Azure.Storage.OperationContext,System.Threading.CancellationToken) System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()异常 System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(System.Threading.Tasks.Task) System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task) System.Runtime.CompilerServices.TaskWaiter.GetResult() Microsoft.Azure.Storage.Core.Executor.Executor.ExecuteSync.AnonymousMethod__0() Microsoft.Azure.Storage.Core.Util.CommonUtility.RunWithoutSynchronizationContext(System.Func) Microsoft.Azure.Storage.Core.Executor.Executor.ExecuteSync(Microsoft.Azure.Storage.Core.Executor.RESTCommand,Microsoft.Azure.Storage.RetryPolicys.iRetryPolicys,Microsoft.Azure.Storage.OperationContext) Microsoft.Azure.Storage.Blob.CloudBlob.DownloadRangeToStream(System.IO.Stream、long?、long?、Microsoft.Azure.Storage.AccessCondition、Microsoft.Azure.Storage.Blob.BlobRequestOptions、Microsoft.Azure.Storage.OperationContext) Microsoft.Azure.Storage.Blob.CloudBlob.DownloadToStream(System.IO.Stream、Microsoft.Azure.Storage.AccessCondition、Microsoft.Azure.Storage.Blob.BlobRequestOptions、Microsoft.Azure.Storage.OperationContext) ... [调用堆栈被截断]

1) 我看到您从方法返回了一个
任务
,但没有等待任何事情。
将'async'关键字添加到方法签名中并更改以下代码是一种良好的做法:

var tokenProvider = new AzureServiceTokenProvider().GetAccessTokenAsync("https://storage.azure.com/",tenantId);
例如:

var tokenProvider = new AzureServiceTokenProvider();
var token = await tokenProvider.GetAccessTokenAsync("https://storage.azure.com/",tenantId);
var tokenCredential = new TokenCredential(token );
现在,获取您的访问令牌,您可以使用类似的工具将其打开并检查声明

2) 正在尝试从以下位置更改访问令牌:

GetAccessTokenAsync("https://storage.azure.com/",tenantId);
致:

3)
AzureServiceTokenProvider
将在一组预定义的位置查找凭据

值得一读,以帮助排除故障。
你试过使用第一个吗