c# - Azure Blob 存储共享访问签名 (SAS) - 签名不匹配
问题描述
我正在尝试通过将 ARM 模板和参数文件上传到私有 Blob 存储容器中来部署 VM,然后在需要时下载它们。文件上传到容器中很好,但是当尝试下载它们时,SAS 令牌无法进行身份验证,给出错误:
Microsoft.Rest.Azure.CloudException:
Unable to download deployment content from 'https://cloudstationsbackendsa.blob.core.windows.net/workstation-templates/CreateVMTemplate.json?sv=2018-03-28&sr=b&sig=GHgWUiEG7bG3%2FDN4cjSsmHGrBTdM8F2LRxNTss5cJB0%3D&st=2019-03-06T11:16:42Z&se=2019-03-06T11:31:42Z&sp=r'
在浏览器中访问此 URL 会产生以下错误:
<Error>
<Code>AuthenticationFailed</Code>
<Message>
Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature. RequestId:8e274bc1-101e-0011-3f0c-d45f43000000 Time:2019-03-06T11:03:53.3144543Z
</Message>
<AuthenticationErrorDetail>
Signature did not match. String to sign used was r 2019-03-06T10:58:39Z 2019-03-06T11:13:39Z /blob/cloudstationsbackendsa/workstation-templates/CreateVMTemplate.json 2018-03-28
</AuthenticationErrorDetail>
</Error>
这是用于上传文件和生成 SAS 令牌的方法:
public async Task<StorageAccountAccessDTO> UploadTemplatesAsync(string azureIdentifier)
{
// Access to Storage Account
var account = CloudStorageAccount.Parse(_config.GetValue<string>("ConnectionStrings:StorageAccount"));
var serviceClient = account.CreateCloudBlobClient();
var container = serviceClient.GetContainerReference("workstation-templates");
// Upload VM ARM Template
var templateBlob = container.GetBlockBlobReference("CreateVMTemplate.json");
await templateBlob.UploadFromFileAsync("CreateVMTemplate.json");
// Upload VM ARM Parameters
var parameterBlob = container.GetBlockBlobReference("Parameters.json");
await parameterBlob.UploadFromFileAsync("Parameters.json");
// Create SAS Tokens
SharedAccessBlobPolicy sasConstraints = new SharedAccessBlobPolicy();
sasConstraints.SharedAccessStartTime = DateTimeOffset.UtcNow.AddMinutes(-5);
sasConstraints.SharedAccessExpiryTime = DateTimeOffset.UtcNow.AddMinutes(10);
sasConstraints.Permissions = SharedAccessBlobPermissions.Read;
var accessDTO = new StorageAccountAccessDTO()
{
TemplateURL = templateBlob.Uri + templateBlob.GetSharedAccessSignature(sasConstraints),
ParametersURL = templateBlob.Uri + parameterBlob.GetSharedAccessSignature(sasConstraints)
};
return accessDTO;
}
SAS 令牌附加到 blob 的 URI 并在 StorageAccountAccessDTO 中返回,这将传递到以下方法以生成 VM:
public async Task CreateVirtualMachineAsync(string azureIdentifier, StorageAccountAccessDTO accessDTO)
{
await _azure.Deployments.Define("myDeployment")
.WithExistingResourceGroup(azureIdentifier + "-RG")
.WithTemplateLink(accessDTO.TemplateURL, "1.0.0.0")
.WithParametersLink(accessDTO.ParametersURL, "1.0.0.0")
.WithMode(DeploymentMode.Incremental)
.CreateAsync();
}
感谢您的宝贵时间,如果您需要任何额外的详细信息,请告诉我!
解决方案
您正在尝试使用templateBlob
带有签名的 URL parameterBlob
。
在那里:
ParametersURL = templateBlob.Uri + parameterBlob.GetSharedAccessSignature(sasConstraints)
使用正确的变量会更好:
ParametersURL = parameterBlob.Uri + parameterBlob.GetSharedAccessSignature(sasConstraints)
干杯!
推荐阅读
- javascript - css工具提示位置不固定
- c# - 服务器端投影
- angular - 更改角度 6 中的默认 html 模板
- javascript - 使用 javascript 或 angularjs 从本地驱动器路径获取所有文件,而不使用文件标签
- python - UnboundLocalError:分配前引用的局部变量“Counter”
- php - JSON_CONTAINS 无法从 MySQL 中找到
- wordpress - 将特定属性添加到 WordPress 的次要产品选项卡?
- python - 如何检查 keras 分类器/神经网络训练的类?
- wolkenkit - 无法登录 wolkenkit-boards 应用程序
- python - 如何在 tkinter 中创建具有 .png 背景的按钮