Amazon s3:直接上传与预签名 URL

nic*_*tch 6 c# amazon-s3 amazon-web-services

我正在使用 AWS SDK for .NET,并且正在寻找一种让用户直接上传到 s3 存储的方法。

我遇到过 aws 提供的两种不同的方式:

基于浏览器的上传:https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-authentication-HTTPPOST.html

和预签名网址:https://docs.aws.amazon.com/AmazonS3/latest/dev/UploadObjectPreSignedURLDotNetSDK.html

看来预签名的 url 是“更容易”,因为 aws sdk 中已经存在一种方法来生成要传递给客户端的 url,让他将对象直接放入存储桶(与浏览器上传相比,它似乎也很轻松,因为它不'不需要浏览器在发布表单中上传所需的所有密钥)。

但我想知道为什么实际上有两种不同的方法。每一种的优点和缺点是什么?

rae*_*man 5

这完全取决于您是否想使用 REST API 还是 AWS SDK 与 S3 交互。

在这两种情况下,您都需要证明(验证/签名请求)您的身份,除非存储桶是公共的。

a)如果您要使用 REST API,为了证明身份,您需要使用“ AWS Signature version 4 ”(也有已弃用的版本 2)签署您的请求,其中包括三种方法(您已列出的一种)

  1. 对请求进行身份验证:使用授权标头(AWS 签名版本 4)
  2. 对请求进行身份验证:使用查询参数(AWS 签名版本 4)
  3. 对请求进行身份验证:使用 POST 基于浏览器的上传(AWS 签名版本 4)

b)如果您要使用AWS SDK,您应该让SDK进行签名仪式(流程)。所以选择直接使用SDK来对请求进行签名

(问题的一部分)与浏览器上传相比,它似乎也很轻松,因为它不需要浏览器上传在发布表单中所需的所有密钥<

对于下面的代码, s3Client已经获得了您的凭据,无论是来自 AWS-CLI-Profile(如果运行本地/笔记本电脑)、IAM 角色(如果是 EC2、lambda 等)

string url = s3Client.GetPreSignedURL(request);
Run Code Online (Sandbox Code Playgroud)