使用AD令牌获取请求的Azure Blob存储“授权权限不匹配”错误

时间:2018-10-11 22:28:05

标签: azure azure-active-directory azure-storage-blobs azure-blob-storage

我正在构建一个Angular 6应用程序,它将能够在Azure Blob存储上进行CRUD操作。但是,我在使用邮递员来测试请求之前,先在应用程序内部实现请求,然后将从Angular获得的令牌复制粘贴到该资源中。

当尝试读取存储在存储中的文件以进行测试时,我得到:<Code>AuthorizationPermissionMismatch</Code> <Message>This request is not authorized to perform this operation using this permission.

  • 所有在生产环境中(尽管正在开发中)
  • 通过Oauth为存储资源专门获取的令牌
  • 邮递员将代币策略定为“ bearer”
  • 应用程序已授予“ Azure存储”委托权限。
  • 应用程序和我要获取令牌的帐户都被添加为“所有者”在蔚蓝的访问控制IAM中
  • 我的IP已添加到Blob存储上的CORS设置中。
  • StorageV2(通用v2)-标准-热门
  • 使用的
  • x-ms-version标头是:2018-03-28,因为这是我能找到的最新版本,并且我刚刚创建了存储帐户。

6 个答案:

答案 0 :(得分:4)

我发现不足以将该应用程序和帐户添加为所有者,我要进入您的存储帐户> IAM>添加角色并为此类型的请求添加特殊权限,STORAGE BLOB DATA CONTRIBUTOR(PREVIEW)< / p>

答案 1 :(得分:2)

确保在命令末尾添加/Y

答案 2 :(得分:1)

请注意,如果您想在订阅范围内应用“ STORAGE BLOB DATA XXXX”角色,则在您的订阅具有Azure DataBricks命名空间的情况下,它将不起作用:

  

如果您的订阅包含Azure DataBricks命名空间,则将阻止在订阅范围内分配的角色授予对blob和队列数据的访问权限。

来源:https://docs.microsoft.com/en-us/azure/storage/common/storage-auth-aad-rbac-portal#determine-resource-scope

答案 3 :(得分:1)

使用以下内容使用Azure AD连接到Blob存储: 这是使用SDK V11的代码,因为V12仍然存在多个AD帐户的问题 看到这个问题 https://github.com/Azure/azure-sdk-for-net/issues/8658 要进一步阅读V12和V11 SDK

https://docs.microsoft.com/en-us/azure/storage/blobs/storage-quickstart-blobs-dotnet-legacy

https://docs.microsoft.com/en-us/azure/storage/blobs/storage-quickstart-blobs-dotnet

using Microsoft.Azure.Services.AppAuthentication;
using Microsoft.Azure.Storage.Auth;
using Microsoft.Azure.Storage.Blob;
using Microsoft.Azure.Storage.Queue;

[Fact]
public async Task TestStreamToContainer()
        {
            try
            {
                var accountName = "YourStorageAccountName";
                var containerName = "YourContainerName";
                var blobName = "File1";
                var provider = new AzureServiceTokenProvider();
                var token = await provider.GetAccessTokenAsync($"https://{accountName}.blob.core.windows.net");
                var tokenCredential = new TokenCredential(token);
                var storageCredentials = new StorageCredentials(tokenCredential);

                string containerEndpoint = $"https://{accountName}.blob.core.windows.net";

                var blobClient = new CloudBlobClient(new Uri(containerEndpoint), storageCredentials);
                var containerClient = blobClient.GetContainerReference(containerName);
                var cloudBlob = containerClient.GetBlockBlobReference(blobName);


                string blobContents = "This is a block blob contents.";
                byte[] byteArray = Encoding.ASCII.GetBytes(blobContents);

                using (MemoryStream stream = new MemoryStream(byteArray))
                {
                    await cloudBlob.UploadFromStreamAsync(stream);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                Console.ReadLine();
                throw;
            }
        }

答案 4 :(得分:0)

我已经通过将GetAccessTokenAsync方法中请求的资源从“ https://storage.azure.com”更改为我的存储Blob的URL来解决此问题,如以下代码片段:

    public async Task<StorageCredentials> CreateStorageCredentialsAsync()
    {
        var provider = new AzureServiceTokenProvider();
        var token = await provider.GetAccessTokenAsync(AzureStorageContainerUrl);
        var tokenCredential = new TokenCredential(token);
        var storageCredentials = new StorageCredentials(tokenCredential);
        return storageCredentials;
    }

其中AzureStorageContainerUrl设置为https://xxxxxxxxx.blob.core.windows.net/

答案 5 :(得分:0)

确保使用 Storage Blob Data Contributor 而不是 Storage Account Contributor,后者仅用于管理实际的存储帐户而不是其中的数据。