Azure 无法从本地环境将blob存储上载/下载到容器
我有一个退出的功能应用程序,它可以从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的代码: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中工作)。我是否需要在本地设置或项目设置中配置其他设置,以使这些功能
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_u11.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_01.b_0()
位于Microsoft.Azure.Storage.Core.Util.CommonUtility.RunWithoutSynchronizationContext[T](Func
1 actionToRun)
在Microsoft.Azure.Storage.Core.Executor.Executor.ExecuteSync[T](RESTCommand1 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
将在一组预定义的位置查找凭据
值得一读,以帮助排除故障。你试过使用第一个吗