簡體   English   中英

使用C#向AWS IAM發出(POST)簽名請求

[英]Making (POST) signed requests to AWS IAM using C#

我正在嘗試按照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);

有人可以幫助我在這里做錯了嗎?

也許,但我強烈建議一起跳過這一努力,只需使用優秀的AWS SDK for .NET代替所有AWS API交互,因為它確實通過為許多AWS服務提供.NET API來幫助消除編碼的復雜性,包括Amazon S3,Amazon EC2,DynamoDB等

  • 我在AWS中與各種環境和各種語言合作多年,在沒有他們提供的眾多SDK之一的幫助下,我甚至從未打算使用他們的API,其中大多數都提供高水平的工具除了首先使用各自語言的API工作之外更容易。

但是如果你真的需要或者想要自己做,我建議你只看一下這些非常棒的SDK的源代碼,這些源代碼都可以在GitHub上找到 ,包括用於.NETAWS SDK - 關於這個問題。你可能想要開始研究AWS4Signer.cs

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM