在C#中创建Azure Blob SAS密钥时出现“资源类型访问不足”

时间:2018-08-14 12:22:38

标签: c# azure

我正在C#代码中创建SAS密钥,如下所示。

        string returnValue = String.Empty;
        // Create a new access policy for the account with the following properties:
        SharedAccessAccountPolicy policy = new SharedAccessAccountPolicy()
        {
            Permissions = SharedAccessAccountPermissions.Read | SharedAccessAccountPermissions.Write | SharedAccessAccountPermissions.Create,
            Services = SharedAccessAccountServices.Blob,
            ResourceTypes = SharedAccessAccountResourceTypes.Container | SharedAccessAccountResourceTypes.Object,
            SharedAccessExpiryTime = DateTime.UtcNow.AddHours(10),
            Protocols = SharedAccessProtocol.HttpsOrHttp
        };

        // Create new storage credentials using the SAS token.
        ExecuteWithExceptionHandling(
                () =>
                {
                    returnValue = storageAccount.GetSharedAccessSignature(policy);                        
                });
        return returnValue;

此代码正确生成了一个密钥。但是,当我尝试在Azure Storage Explorer中使用此密钥时,出现错误消息Inadequate resource type access. At least service-level ('s') access is required.

当我尝试使用javascript中的此键创建容器时,在Refused to set unsafe header "user-agent"文件中收到说azure-storage-blob.min.js的错误(来自Microsoft的Azure Storage api)。

我在SharedAccessAccountPolicy中添加了创建许可权,但是由于某些原因,生成的密钥不起作用。

编辑: 用于创建blobservice的Javascript代码。

    var blobService = AzureStorage.Blob.createBlobServiceWithSas(blobUri, $("#SASToken").val());
blobService.createContainerIfNotExists(folderID, function (error, result) {
    if (error) {
        return false;
    } else {
        return true;
    }
});

编辑: 下面是azure门户的屏幕截图,我尝试在其中生成手动令牌。甚至该令牌中也包含ss=b,而不是文档中的sr=b

我尝试了手动生成的令牌。并且JS代码仍然显示Refused to set unsafe header "user-agent"

Azure Portal

1 个答案:

答案 0 :(得分:1)

显然,这是Azure提供的该死的js文件的问题。 https://github.com/Azure/azure-storage-node/issues/463 这是一张关于它的公开票。

无论如何,到目前为止,我已经添加了一个条件以确保不添加标题。如果代码仍然失败,我将创建另一个问题。

我认为,在两天内,我可以获取Azure的js的最新更新,并且此问题可以自行解决。万一任何人都需要快速修复,这是我完成的代码更改。

if (e[0] != 'user-agent'){ s.setRequestHeader(e[0],e[1])}}

代替s.setRequestHeader(e[0],e[1])}

这只是一个临时解决方案。最佳选择仍然是将Azure存储js文件更新到2.10.101版本或更高版本。