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:
