Making requests using IAM user temporary credentials giving Authentication failed from c# code while postman giving success response

250 Views Asked by At

I am trying to make an api request to an Amazon service API. For this first I have to create temporary credentials by assumingRole and using that temp credentials I then have to make the api request.

Below is my code for getting temp credentials:

private static async Task<Aws.Crt.Auth.Credentials> GetTemporaryCredentialsAsync()
    {
        using (var stsClient = new AmazonSecurityTokenServiceClient(aws_access_key_id, aws_secret_access_key))
        {

            var response = await stsClient.AssumeRoleAsync(new AssumeRoleRequest
            {
                RoleArn = "arn:aws:iam::77790******:role/AmazonLendingAPIRole",
                RoleSessionName = "Assume123",
                DurationSeconds = 3600
            });

            Credentials credentials = response.Credentials;

            var sessionCredentials =
                new Aws.Crt.Auth.Credentials(credentials.AccessKeyId,
                                          credentials.SecretAccessKey,
                                          credentials.SessionToken);
            return sessionCredentials;
        }
    }

This giving me temp credentials which I am passing down to amazon signing service. For signing I am using this extension. This returns my signature request. Below is the code:

            var signingService = new SigV4ASign();
        var assumeRoleUserCredentials = await GetTemporaryCredentialsAsync(); ;

         var endpoint = endpoint_get_offer;
        var awsCredentials = new Aws.Crt.Auth.Credentials(assumeRoleUserCredentials.AccessKeyId, assumeRoleUserCredentials.SecretAccessKey, assumeRoleUserCredentials.SessionToken);
        
        var method = HttpMethod.Get;

        var headers = signingService.SignRequest(method.Method, "eu-west-1", endpoint, "execute-api", awsCredentials);

        using var client = new HttpClient();
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Clear();
        foreach (var header in headers)
        {
            client.DefaultRequestHeaders.TryAddWithoutValidation(header.Name, header.Value);
        }
        client.DefaultRequestHeaders.TryAddWithoutValidation("x-api-key", "WEuqF5RDOi5R1pza2601***************");

        var response = await client.GetAsync(endpoint);

However, the above code is giving me "Authentication Error". The temp credentials I am getting from GetTemporaryCredentialsAsync method If I use those credentials in postman its works fine but it somehow doesn't work from my code. I don't know where I am doing wrong.

For your reference here is my code for signing the request:

        public IEnumerable<HttpHeader> SignRequest(string method, string region, string endpoint, string service, Credentials credentials)
    {
        var endpointUri = new Uri(endpoint);
        var request = new HttpRequest
        {
            Method = method,
            Uri = endpointUri.PathAndQuery,
            Headers = new[] { new HttpHeader("host", endpointUri.Host) }
        };

        var config = new AwsSigningConfig
        {
            Service = service,
            Region = region,
            Algorithm = AwsSigningAlgorithm.SIGV4A,
            SignatureType = AwsSignatureType.HTTP_REQUEST_VIA_HEADERS,
            SignedBodyHeader = AwsSignedBodyHeaderType.X_AMZ_CONTENT_SHA256,
            Credentials = credentials,
        };

        var result = AwsSigner.SignHttpRequest(request, config);
        AwsSigner.CrtSigningResult signingResult = result.Get();
        HttpRequest signedRequest = signingResult.SignedRequest;

        return signedRequest.Headers;
    }

My IAM User looks like below:

enter image description here

0

There are 0 best solutions below