当前位置: 首页 > 编程语言 > C#

当我设置包含“+”的响应标头覆盖时,为什么我的S3预签名请求不起作用?

时间:2023-04-10 15:49:43 C#

为什么当我设置包含“+”的响应标头覆盖时我的S3预签名请求不起作用?我正在使用Amazon.NETSDK生成这样的预签名URL:publicSystem.Web.Mvc.ActionResultAsActionResult(stringcontentType,stringcontentDisposition){headerOverrides.ContentType=contentType;如果(!string.IsNullOrWhiteSpace(contentDisposition)){headerOverrides.ContentDisposition=contentDisposition;}GetPreSignedUrlRequestrequest=newGetPreSignedUrlRequest().WithBucketName(bucketName).WithKey(objectKey).WithProtocol(Protocol.HTTPS).WithExpires(DateTime.Now.AddMinutes(6)).WithResponseHeaderOverrides(headerOverrides);字符串url=S3Client.GetPreSignedURL(请求);返回新的RedirectResult(url,permanent:false);这完美地工作,除非我的contentType包含+。当我尝试获取SVG文件时会发生这种情况,例如,它获取image/svg+xml的内容类型。在这种情况下,S3会抛出SignatureDoesNotMatch错误。错误消息显示StringToSign看起来像这样:GET1234567890/blah/blabh/blah.svg?response-content-disposition=filename="blah.svg"&response-content-type=image/svgxml注意response-content-type中有一个空格,现在它表示image/svgxml而不是image/svg+xml。在我看来,这就是导致问题的原因,但是解决这个问题的正确方法是什么?我应该编码我的内容类型吗?用引号或其他东西将其括起来?文档没有说明这一点。更新此错误已从SDK版本1.4.1.0开始修复。解决方法这是AWSSDK中已确认的错误,因此在他们发布修复程序之前,我会使用此hack来让事情正常进行:在响应标头中准确指定内容类型。所以如果你想让S3返回一个内容类型为image/svg+xml,这样设置:ResponseHeaderOverridesheaderOverrides=newResponseHeaderOverrides();headerOverrides.ContentType="图片/svg+xml";现在,继续像往常一样生成标头签名请求:GetPreSignedUrlRequestrequest=newGetPreSignedUrlRequest().WithBucketName(bucketName).WithKey(objectKey).WithProtocol(Protocol.HTTPS).WithExpires(DateTime.Now.AddMinutes(6))。WithResponseHeaderOverrides(headerOverrides=URL).GetPreSignedURL(请求);最后,使用适合您的内容类型的正确URL编码值“修复”生成的URL:url=url.Replace(contentType,HttpUtility.UrlEncode(contentType));是的,这是一个肮脏的解决方法,但是,嘿,它对我有用!确实很奇怪-我已经能够通过以下观察到的行为轻松地重现这一点:在调用GetPreSignedURL()之前对contentType进行预编码,例如通过HttpUtility.UrlEncode方法,生成无效签名考虑到此功能已经存在了多长时间,这有点令人惊讶,但我仍然认为这是一个错误-因此最好在AmazonSimpleStorageService论坛上询问这个问题。更新:我刚刚意识到你在那里问了同样的问题,确实这个错误已经得到确认,所以正确的答案可以通过监控AWS团队的响应来确定;)更新:这个错误已经在1.4.1.0版本中得到修复SDK修复。以上是C#学习教程:为什么我的S3预签名请求在我设置了一个包含“+”的响应头覆盖时不起作用?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: