Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.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# 使用C向AWS IAM发出(后)签名请求#_C#_Amazon Web Services_Http Post_Amazon Iam - Fatal编程技术网

C# 使用C向AWS IAM发出(后)签名请求#

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)

我尝试按照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)
    {
        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变得更加容易
但是如果你真的需要或者想自己做,我建议你只需要看看这些SDK的源代码,这些都是,包括一个,关于手头的问题,你可能想开始研究

  • 请注意,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);