C# 使用C向AWS IAM发出(后)签名请求#
我尝试按照AWS文档中给出的示例,在C#中调用ListUsers。我已到达生成签名的最后阶段(即准备提交在中给出的已签名请求)。但我在下面粘贴的代码在提交时抛出了“坏请求”异常C# 使用C向AWS IAM发出(后)签名请求#,c#,amazon-web-services,http-post,amazon-iam,C#,Amazon Web Services,Http Post,Amazon Iam,我尝试按照AWS文档中给出的示例,在C#中调用ListUsers。我已到达生成签名的最后阶段(即准备提交在中给出的已签名请求)。但我在下面粘贴的代码在提交时抛出了“坏请求”异常 static void submitSignedRequest(string my_access_key, string my_secret_key, string signature, string curr_utc_date_string, string curr_utc_datetime_string)
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,尽管我相信差异是显而易见的)
谁能帮帮我,我在这里做错了什么
也许吧,但我强烈建议大家跳过这一步,而将优秀的API用于所有AWS API交互,因为它确实有助于降低编码的复杂性,因为它为许多AWS服务提供了.NET API,包括Amazon S3、Amazon EC2、DynamoDB等
- 我在各种环境和各种语言中与AWS合作多年,在没有他们提供的帮助的情况下,我甚至从未考虑过使用他们的API,其中大多数都提供了高级工具,而且首先可以使使用各自语言的API变得更加容易
- 请注意,AWS刚刚发布了经过重大修改的版本2,详情请参见
400错误请求
响应的主体(抱歉,不是C#人,因此我无法具体告诉您如何操作)。400响应,其中2个与签名本身有关,其他表示其他问题。应该有一个机构对这一反应,这将提供更多的信息。谢谢你的答复。我终于自己解决了。(编辑了我的帖子并提供了答案)当我被困在上面的时候,我实际上是在为WindowsPhone7写这篇文章,而WindowsPhone7到现在还没有任何SDK。但GA发布的链接似乎令人鼓舞,因为它说“支持WindowsPhone8”,让我看看这是否让我的生活更轻松。不过,感谢您的快速回复和指点。我仍然对这个问题持开放态度,看看上面的问题是否可以得到解决。我曾经尝试过查看SDK,但对我来说,调整和/或采用它有点太多了。我自己解决了我的问题。谢谢你的帮助。我可以使用S3的.NETSDK和其他aws服务,API网关呢?如何向API网关上受IAM保护的端点发送请求?在调用api之前,我需要使用aws密钥对请求进行签名。
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);