我有一个API网关,在那里我将身份验证设置为使用AWS_IAM。这需要我使用AWS V4签名对每个请求进行签名,并在标头中附加HMAC。我在nodejs中找到了可以使用V4签名对请求进行签名的库。但我找不到一个库来为我签名。即使是.NET的aws-sdk也为自己的特定用例进行了抽象。那里有图书馆吗(我在谷歌上快速搜索了一下,没有找到结果)?还是我需要自己写下hmac?
虽然这是一个老问题,但由于AWS在上面的评论中没有对.NET AWS SDK"进行相应的优先级排序",而且这在今天仍然是一个相关的问题,我找到了一个很好的库,可以为您处理AWS V4请求签名。
这是Nuget包。
这是GitHub的源代码和实现文档。
此外,我发现为了让我的API网关AWS_IAM授权使用临时安全凭据,您还需要将"x-amz-security-tooken"标头与当前会话令牌一起包含在您的请求中,因为它的值也是一样的。
您可以阅读签名是如何完成的,并且可以(如果您愿意)。我建议引入AWS SDK for.NET,并使用SDK中的功能来实际执行签名。
这是SDK的签名者:
https://github.com/aws/aws-sdk-net/blob/6c3be79bdafd5bfff1ab0bf5fec17abc66c7b516/sdk/src/Core/Amazon.Runtime/Internal/Auth/AWS4Signer.cs
您可能需要对其进行调整(即默认情况下它了解AWS服务和端点)
Aws4RequestSigner的替代方案是AwsSignatureVersion4。我认为它的API更容易使用,但我有偏见,因为我是后者的作者。
使用SSO身份验证时,还需要在http请求中包含一个会话令牌。
在对请求进行签名后,将会话令牌添加到http标头x-amz-security-token
中。
以下是在搜索请求中实现这一点的示例:
var baseUrl = "es_url";
var indexName = "index_name";
var requestUri = new Uri($"{baseUrl}/{indexName}/_search");
var req = new HttpRequestMessage
{
RequestUri = requestUri,
Method = System.Net.Http.HttpMethod.Post,
Content = new StringContent(query, Encoding.UTF8, "application/json")
};
var accessKeyId = "ACCESS_KEY";
var secretKey = "SECRET_KEY"
var sessionToken = "SESSION_TOKEN";
var signer = new AWS4RequestSigner(accessKeyId, secretKey);
req = await signer.Sign(req, "es", "us-west-2");
req.Headers.Add("x-amz-security-token", sessionToken);
var client = new HttpClient();
var response = await client.SendAsync(req);