gpt4 book ai didi

c# - 如何使用 amazon sdk 为虚名域生成预签名的 Amazon S3 url?

转载 作者:行者123 更新时间:2023-11-30 13:04:22 29 4
gpt4 key购买 nike

我有一个名为 foo.example.com 的 s3 存储桶,它的所有 CNAM 都是正确的。

我正在切换到最新的 AWS .net SDK。

我希望生成像这样的预签名 url:

http://foo.example.com/myfile.txt?s3_params_here

注意那里的虚名 cname。

我有:

string bucketName = "foo.example.com";

AmazonS3Client s3Client = new AmazonS3Client("bar", "xxx",
new AmazonS3Config
{
ServiceURL = bucketName,
CommunicationProtocol = Protocol.HTTP
});


string key = "myfile.txt";


GetPreSignedUrlRequest request = new GetPreSignedUrlRequest()
.WithBucketName(bucketName)
.WithKey(key)
.WithExpires(DateTime.Now.AddMinutes(5))
.WithProtocol(Protocol.HTTP);

string url = s3Client.GetPreSignedURL(request);

我得到的 url 是这样的:

http://foo.example.com.foo.example.com/myfile.txt?AWSAccessKeyId=bar&Expires=1331069777&Signature=234KoUUvfE1nCcs2vLj9RQUhqF8%3D

这显然是错误的。

我尝试了 ServiceURL、bucketname 等多种不同的变体,但似乎没有任何效果。

我找不到任何好的文档 - 执行此操作的正确方法是什么?

谢谢。

最佳答案

更新[解决方法]

我同时解决了我的相互矛盾的测试结果,这些结果分别源于非系统测试和 URL 操作。以下解决方法对我有用(即经过测试和可重现),只需从您的解决方案开始:

string bucketName = "foo.example.com";

// [...]

GetPreSignedUrlRequest request = new GetPreSignedUrlRequest()
.WithBucketName(bucketName)
.WithKey(key)
.WithExpires(DateTime.Now.AddMinutes(32))
.WithProtocol(Protocol.HTTP);

现在这会产生具有重复域名的错误 URL,即 http://foo.example.com.foo.example.com/myfile.txt?[...]

虽然可以简单地删除重复项,例如:

string url = s3Client.GetPreSignedURL(request);

// KLUDGE: remove duplicate domain name.
url = url.Replace(bucketName + "." + bucketName, bucketName);

通过解决遇到的限制,这为我生成了一个正常工作的预签名 URL(即 http://foo.example.com/myfile.txt?[...])下面概述了所需的方法。

理由

像这样操作生成的 URL 看起来很奇怪,但这对查询字符串身份验证没有影响符合这些签名的创建方式,请参阅 Query String Request Authentication Alternative ,您可以在其中找到说明查询字符串请求身份验证方法的伪语法:

StringToSign = HTTP-VERB + "\n" +
Content-MD5 + "\n" +
Content-Type + "\n" +
Expires + "\n" +
CanonicalizedAmzHeaders +
CanonicalizedResource;

也就是说,域名根本不用于签名创建,而只是关于资源本身的信息;引用的伪语法片段正下方的 Example Query String Request Authentication 部分使用实际资源说明了这一点。

评估

我不知道我们是否仍然存在误解,或者这可能只是 AWS SDK for .NET 中的一个错误,例如参见Why is my S3 pre-signed request invalid when I set a response header override that contains a “+”?对于通过类似的解决方法解决的相关错误,同时已修复;因此,这可能会升级到 AWS 论坛和/或支持 channel 以获得适当的答案或解决方案。

祝你好运!


期望的答案[功能失调]

S3 CNAME 处理已经暗示了存储桶名称,因此您需要做的就是从 GetPreSignedUrlRequest 中删除您的存储桶名称,即它应该如下所示:

GetPreSignedUrlRequest request = new GetPreSignedUrlRequest()
.WithKey(key)
.WithExpires(DateTime.Now.AddMinutes(5))
.WithProtocol(Protocol.HTTP);

我已经用我的一桶测试了它,它像预期的那样工作。

关于c# - 如何使用 amazon sdk 为虚名域生成预签名的 Amazon S3 url?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9592298/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com