【问题标题】:Making (POST) signed requests to AWS IAM using C#使用 C# 向 AWS IAM 发出 (POST) 签名请求
【发布时间】:2013-11-10 20:23:32
【问题描述】:

我正在尝试遵循 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);

【问题讨论】:

  • 尝试获取并显示400 Bad Request 响应的正文(抱歉,不是 C# 人员,所以我无法具体告诉您如何操作)。 400响应has multiple possible meanings,其中2个与签名本身有关,其他表示其他问题。该响应应该有一个正文,可以提供更多信息。
  • 感谢您的回复。我终于自己解决了。 (编辑了我的帖子并提供了答案)

标签: c# amazon-web-services http-post amazon-iam


【解决方案1】:

谁能帮我在这里做错了什么?

也许可以,但我强烈建议您一起跳过这项工作,而只使用出色的 AWS SDK for .NET 进行所有 AWS API 交互,因为它确实 通过提供 .NET API 来帮助降低编码的复杂性许多 AWS 服务,包括 Amazon S3、Amazon EC2、DynamoDB 等

  • 多年来,我在各种环境和各种语言中与 AWS 合作,如果没有他们提供的 multitude of SDKs 之一的帮助,我什至从未费心研究使用他们的 API,其中大部分提供高级工具,并首先让使用您各自语言的 API 变得更加容易。

但如果你真的需要或想自己做,我建议简单地看一下这些 SDK 的源代码,它们都是 available at GitHub,包括 AWS SDK for .NET 的源代码 - 关于这个问题例如,您可能想开始研究AWS4Signer.cs

【讨论】:

  • 当我卡在上面时,我实际上是为 windows phone 7 编写的,到目前为止还没有任何 SDK。但是 GA 发布链接似乎令人鼓舞,因为它说“支持 windows phone 8”,让我看看这是否让我的生活更轻松。不过,感谢您的快速回复和指点。我仍然保留这个问题,看看是否可以以某种方式解决上述问题
  • 我尝试查看 SDK,但调整和/或采用它对我来说有点太多了。我的问题自己解决了。尽管如此,还是感谢您的帮助。
  • 我可以将 .NET SDK 用于 S3 和其他一些 aws 服务,API 网关怎么样?如何向 API Gateway 上的 IAM 保护端点发送请求?在调用 api 之前,我需要使用 aws 密钥对请求进行签名。
猜你喜欢
  • 2013-12-09
  • 2015-04-04
  • 2016-11-03
  • 1970-01-01
  • 1970-01-01
  • 2016-05-30
  • 2018-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多