Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在没有SDK的情况下验证AmazonS3RESTful调用_C#_Amazon S3 - Fatal编程技术网

C# 如何在没有SDK的情况下验证AmazonS3RESTful调用

C# 如何在没有SDK的情况下验证AmazonS3RESTful调用,c#,amazon-s3,C#,Amazon S3,我想进行Restful S3调用来上传/下载/列出我存储桶中的文件。AWS网站详细解释了所有内容,但从头开始编写有点复杂和耗时。任何人都可以分享一些他们可能有的示例代码吗 (我知道这违反了stackoverflow规则,但我还是要回答我自己的问题:)下面是一个如何通过使用AccessKey/SecretKey组合生成临时AuthKey从S3下载文件的示例。我使用这种方法为我们的客户生成一个临时下载链接,这样他们就可以下载他们的文件,而无需任何特殊访问 static void Main(strin

我想进行Restful S3调用来上传/下载/列出我存储桶中的文件。AWS网站详细解释了所有内容,但从头开始编写有点复杂和耗时。任何人都可以分享一些他们可能有的示例代码吗


(我知道这违反了stackoverflow规则,但我还是要回答我自己的问题:)

下面是一个如何通过使用AccessKey/SecretKey组合生成临时AuthKey从S3下载文件的示例。我使用这种方法为我们的客户生成一个临时下载链接,这样他们就可以下载他们的文件,而无需任何特殊访问

static void Main(string[] args)
{
    string accessKey = "ACCESS_KEY";
    string secretKey = "SECRET_KEY";
    string bucketName = "BUCKET_NAME";
    string pathToFile = "FOLDER1/FOLDER2/MyFile.txt";
    DateTime authKeyExpirationDate = DateTime.Now.AddHours(1);

    string authenticatedDownloadLink = GenerateDownloadLink(bucketName, pathToFile, authKeyExpirationDate, accessKey, secretKey);
    Console.WriteLine(authenticatedDownloadLink);
    Console.Read();
}

private static string GenerateDownloadLink(string bucketName, string pathToFile, DateTime expirationDate, string accessKey, string secretKey)
{
    Uri downloadLink = new Uri(string.Format("https://{0}.s3.amazonaws.com/{1}", bucketName, pathToFile));

    string canonicalizedResource = string.Concat("/", bucketName, "/", pathToFile);

    int secondsSinceEpoch = GetSecondsSinceEpoch(expirationDate);
    string signature = GenerateStringToSign("GET", null, null, secondsSinceEpoch, null, canonicalizedResource);
    string str = SignSignature(signature, accessKey, secretKey);

    System.Collections.Specialized.NameValueCollection nameValueCollection
        = new System.Collections.Specialized.NameValueCollection()
    {
        { "AWSAccessKeyId", accessKey },
        { "Signature", str },
        { "Expires", secondsSinceEpoch.ToString() }
    };

    StringBuilder stringBuilder = new StringBuilder();
    int num = 0;
    foreach (string key in nameValueCollection.Keys)
    {
        stringBuilder.Append(key);
        stringBuilder.Append("=");
        stringBuilder.Append(nameValueCollection[key]);
        num++;
        if (num == nameValueCollection.Keys.Count)
        {
            continue;
        }
        stringBuilder.Append("&");
    }

    UriBuilder uriBuilder = new UriBuilder(downloadLink)
    {
        Query = stringBuilder.ToString()
    };

    return uriBuilder.ToString();
}

private static int GetSecondsSinceEpoch(DateTime expirationDate)
{
    TimeSpan universalTime = expirationDate.ToUniversalTime() - new DateTime(1970, 1, 1);
    return (int)universalTime.TotalSeconds;
}

private static string GenerateStringToSign(string httpVerb, string contentMD5, string contentType, int expires, string canonicalizedAmzHeaders, string canonicalizedResource)
{
    StringBuilder stringBuilder = new StringBuilder(httpVerb);
    stringBuilder.Append("\n");
    stringBuilder.Append(contentMD5);
    stringBuilder.Append("\n");
    stringBuilder.Append(contentType);
    stringBuilder.Append("\n");
    stringBuilder.Append(expires);
    stringBuilder.Append("\n");
    stringBuilder.Append(canonicalizedAmzHeaders);
    stringBuilder.Append(canonicalizedResource);
    return stringBuilder.ToString();
}

private static string SignSignature(string signatureToSign, string accessKey, string secretKey)
{
    byte[] numArray = HMACSHA1_UTF8_Hash(signatureToSign, secretKey);
    return Uri.EscapeDataString(Base64Encode(numArray));
}

private static byte[] HMACSHA1_UTF8_Hash(string input, string key)
{
    byte[] numArray;
    System.Security.Cryptography.HMACSHA1 hMACSHA1 = new System.Security.Cryptography.HMACSHA1(Encoding.UTF8.GetBytes(key));
    using (System.IO.MemoryStream memoryStream = new System.IO.MemoryStream(Encoding.UTF8.GetBytes(input)))
    {
        numArray = hMACSHA1.ComputeHash(memoryStream);
    }
    return numArray;
}

private static string Base64Encode(byte[] data)
{
    return Convert.ToBase64String(data);
}