使用用户委派密钥创建的用户委派SAS获取Blob内容

时间:2019-09-13 19:36:07

标签: azure azure-storage azure-storage-blobs access

我已经按照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       签名字段格式不正确。

1 个答案:

答案 0 :(得分:1)

尝试将Storage Blob Data Contributor角色分配给存储帐户。

Reader角色是一个Azure资源管理器角色,它允许用户查看存储帐户资源,但不能对其进行修改。 它不提供对Azure存储中数据的读取权限,而仅提供给帐户管理资源。

请参阅此article