gpt4 book ai didi

c# - 使用 C# 向 AWS IAM 发出 (POST) 签名请求

转载 作者:太空狗 更新时间:2023-10-30 01:20:13 24 4
gpt4 key购买 nike

我正在尝试按照 AWS 文档 Signing AWS requests 中给出的示例进行操作并在 C# 中调用 ListUsers。我已经到达生成签名的最后阶段(即准备提交在 signature-4 request examples 给出的签名请求)。但是我在下面粘贴的代码在提交时抛出“错误请求”异常。

 static void submitSignedRequest(string my_access_key, string my_secret_key, string signature, string curr_utc_date_string, string curr_utc_datetime_string)
{
string url = "https://iam.amazonaws.com/?Action=ListUsers&Version=2010-05-08&X-Amz-Algorithm=AWS4-HMAC-SHA256&" +
"X-Amz-Credential=" + my_access_key + "/" + curr_utc_date_string + "/us-east-1/iam/aws4_request&X-Amz-Date=" + curr_utc_datetime_string +
"&X-Amz-SignedHeaders=content-type;host;x-amz-date&X-Amz-Signature=" + signature;
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.Method = "POST";
request.Host = "iam.amazonaws.com";
request.ContentType = "application/x-www-form-urlencoded; charset=utf-8";
WebHeaderCollection headers = (request as HttpWebRequest).Headers;


headers.Add("Authorization", "AWS4-HMAC-SHA256 Credential=" + my_access_key +"/" + curr_utc_date_string + "/us-east-1/iam/aws4_request, " +
"SignedHeaders=content-type;host;x-amz-date, Signature=" + signature);
headers.Add("x-amz-date", curr_utc_datetime_string);

HttpWebResponse response;
try
{
response = request.GetResponse() as HttpWebResponse;
}
catch (Exception ex)
{

Console.WriteLine("Error Message: " + ex.Message);
}
}

我得到的输出是:

Error Message:    The remote server returned an error: (400) Bad Request.

有人能帮我看看我做错了什么吗?

编辑:

我终于自己解决了这个问题。我不得不将它转换到下面。 (答案是针对 RDS 的,尽管我相信差异是显而易见的)。

string url = "https://rds.us-west-1.amazonaws.com";
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;

// ASCIIEncoding encoding = new ASCIIEncoding();
string postData = "Action=DescribeDBInstances&Version=2013-09-09";
byte[] data = Encoding.UTF8.GetBytes(postData);

request.Method = "POST";
request.Host = "rds.us-west-1.amazonaws.com";
request.ContentType = "application/x-www-form-urlencoded; charset=utf-8";
// request.ContentLength = data.Length;

using (Stream stream = request.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}

WebHeaderCollection headers = (request as HttpWebRequest).Headers;

request.Headers.Add("Authorization", "AWS4-HMAC-SHA256 Credential=" + my_access_key + "/" + curr_utc_date_string + "/us-west-1/rds/aws4_request, " +
"SignedHeaders=content-type;host;x-amz-date, Signature=" + signature);
request.Headers.Add("x-amz-date", curr_utc_datetime_string);

最佳答案

Can some one help me what wrong I am doing here?

也许吧,但我强烈建议一起跳过这个努力,只使用优秀的 AWS SDK for .NET而是为您所有的 AWS API 交互,因为它确实通过为许多 AWS 服务(包括 Amazon S3、Amazon EC2、DynamoDB 等)提供 .NET API 来帮助消除编码的复杂性

  • 我在各种环境和各种语言中与 AWS 合作多年,如果没有 multitude of SDKs 之一的帮助,我从来没有费心去研究过使用他们的 API。他们提供,其中大部分提供高级工具,除了让您从一开始就更容易使用各自语言的 API。

但是如果你真的需要或者想自己做,我建议你直接看一下这些SDK的源码,都是available at GitHub ,包括 AWS SDK for .NET 的那个- 关于手头的问题,您可能想开始调查 AWS4Signer.cs例如。

关于c# - 使用 C# 向 AWS IAM 发出 (POST) 签名请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19894718/

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