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



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

 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);

有人可以帮助我在这里做错什么吗?

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

  • 我在各种环境和各种语言中使用 AWS 多年,如果没有他们提供的众多开发工具包之一的帮助,我什至从未费心研究使用他们的 API,其中大多数开发工具包除了首先使使用各自语言的 API 变得更加容易之外,还提供高级工具。

但是,如果您真的需要或想自己做,我建议您简单地查看这些开发工具包的源代码,这些SDK都可以在GitHub上找到,包括适用于.NET的AWS SDK - 关于手头的问题,例如.cs您可能想开始研究AWS4Signer。

  • 请注意,AWS 刚刚发布了经过重大修改的版本 2,有关详细信息,请参阅适用于 .NET 的 AWS 开发工具包版本 2 的正式发布。

相关内容

  • 没有找到相关文章

最新更新