我已经按照https://docs.microsoft.com/en-us/azure/storage/common/storage-auth-aad-app创建了一个AAD应用。
已授予对创建的AAD应用程序的Azure存储帐户的访问权限。
获得客户端ID和客户端密码。
要创建用户委托密钥和用户委托sas,我使用的方法和代码如下 https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blob-user-delegation-sas-create-dotnet。
(如文章中所述设置环境变量)。
我可以使用方法GetUserDelegationSasBlob生成用户委托密钥。
容器和blob文件已存在。
现在,我正在使用ReadBlobWithSasAsync方法,使用上面生成的SAS uri读取blob的内容。
但是,出现以下错误。
此请求无权使用此命令执行此操作 允许。 RequestId:5d127eaf-101e-00be-6666-6a3875000000
时间:2019-09-13T19:04:15.4109144Z
状态:403(该请求无权执行此操作 使用此权限。)
错误代码:AuthorizationPermissionMismatch
在另一种方法中,我正在使用rest api生成用户委托密钥。 https://docs.microsoft.com/en-us/rest/api/storageservices/get-user-delegation-key
我能够以xml格式获取用户委托密钥。 我正在按照中的步骤从中创建SAS https://docs.microsoft.com/en-us/rest/api/storageservices/create-user-delegation-sas
对于签名,我使用的是这段代码,使用StringToSign和从委托密钥收到的秘密值。
var encoding = new System.Text.ASCIIEncoding();
byte[] keyByte = encoding.GetBytes(secret);
byte[] messageBytes = encoding.GetBytes(ToSign);
using (var hmacsha256 = new HMACSHA256(keyByte))
{
byte[] hashmessage = hmacsha256.ComputeHash(messageBytes);
String sig= Convert.ToBase64String(hashmessage);
}
我正在执行GET请求。 我尝试了各种参数值,例如,
sr:b和c sks:b和c sp:racwd和r和rw以及更多
skv和sv为2018-11-09,因为创建用户委托密钥需要此版本。
但是GET API返回错误。
AuthenticationFailed
服务器无法验证请求。确保Authorization标头的值格式正确,包括 签名。 RequestId:e4bc8f0f-d01e-0046-7367-6af368000000 时间:2019-09-13T19:12:27.7780695Z 签名字段格式不正确。
答案 0 :(得分:1)
尝试将Storage Blob Data Contributor
角色分配给存储帐户。
Reader
角色是一个Azure资源管理器角色,它允许用户查看存储帐户资源,但不能对其进行修改。 它不提供对Azure存储中数据的读取权限,而仅提供给帐户管理资源。
请参阅此article。