在Azure上上传到容器时,我收到此错误:
服务器无法验证请求。确保值 授权标头的格式正确,包括签名。
我知道问题是由不同的时区引起的。
但是在我的应用程序中,我不能依靠时区来使漏洞生效。我需要一种忽略时区的解决方案,将文件发送到容器。
我没有使用SAS。
这是我要上传的代码:
public async Task<bool> SendPhotosAsync(int examID)
{
try
{
CancellationTokenSource cts = new CancellationTokenSource();
cts.CancelAfter(Constants.SendExamPhotosAsyncTimeout);
foreach (var image in GetExamFacePhotos(examID))
{
var fileName = Path.GetFileName(image);
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(Constants.AzureBlobStorageConnectionString);
// Create the blob client.
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
// Retrieve reference to a previously created container.
CloudBlobContainer container = blobClient.GetContainerReference(Constants.AzureBlobContainerExamFacePhotos);
// Retrieve reference to a blob named "myblob".
CloudBlockBlob blockBlob = container.GetBlockBlobReference(fileName);
// Create or overwrite the "myblob" blob with contents from a local file.
using (var fileStream = File.OpenRead(image))
{
if (fileStream.Length > 0)
{
await blockBlob.UploadFromStreamAsync(fileStream, fileStream.Length, null, null, null, cts.Token);
}
}
}
return true;
}
catch (TaskCanceledException)
{
throw new Exception(_context.GetString(Resource.String.error_task_canceled));
}
catch (Exception)
{
throw new Exception(_context.GetString(Resource.String.error_send_exam_media));
}
}
编辑1
要重现@Gaurav所说的内容,我将设备的GMT更改为0,并保留了当前的GMT(-3),GMT-0 09:02的时间,并将其保存在ExtendedErrorInformation
上:
请求日期标头太旧:“星期一,2019年3月11日09:02:25 GMT”
Azure同时检查请求的时间和GMT。如果不匹配,则会显示错误。
更改为GMT-4并将时间设置为正确的时区GMT-4 08:15,请求已成功完成。
因此,时区无关紧要,因为时间与其时区匹配。