【问题标题】:C# AWS SDK SecurityTokenServiceClient.AssumeRole returning "SignatureDoesNotMatch" 403 forbiddenC# AWS SDK SecurityTokenServiceClient.AssumeRole 返回“SignatureDoesNotMatch”403 被禁止
【发布时间】:2020-07-19 02:10:11
【问题描述】:

我一直在开发环境中实现 AWS S3 与 C# AWS 开发工具包的集成,一切进展顺利。部分要求是 IAM AccessKey 和 SecretKey 轮换,凭证/配置文件存储或缓存,并且在此过程中还需要承担角色。

我有一个方法,它在使用 AccessKey、SecretKey 和 RegionEndpoint 初始化 AmazonSecurityTokenServiceClient 后返回凭据,使用 RoleArn 格式化 AssumeRoleRequest,然后执行请求:

using (var STSClient = new AmazonSecurityTokenServiceClient(accessKey, secretKey, bucketRegion))
{
    try
    {
        var response = STSClient.AssumeRole(new AssumeRoleRequest(roleARN));

        if (response.HttpStatusCode == System.Net.HttpStatusCode.OK) return response.Credentials;
    }
    catch (AmazonSecurityTokenServiceException ex)
    {
        return null;
    }
}

这很简单,因为真正的实现会验证凭证变量等。它与 AWS 开发人员代码示例相匹配(尽管我再也找不到该页面的链接了)。

这在开发中运行得很好。将其移至具有新 AWS 凭证的 QA 环境后,我确信已在与开发凭证相同的过程中设置了该凭证,现在我在 AssumeRole 调用中收到异常。

实际的 AssumeRole 方法不包括它会抛出该异常的文档,它只是它引发的那个。 StatusCode:403 Forbidden,ErrorCode:SignatureDoesNotMatch,ErrorType:Sender,消息“我们计算的请求签名与您提供的签名不匹配......”。

我已经排除的事情:

  • 键正确且不包含转义字符 (/) 或前导/尾随空格

  • bucket 区域是正确的 us-west-2

  • sts 身份验证区域是 us-east-1

  • SignatureVersion 为 4

切换回开发密钥有效,但这不是一个生产友好的解决方案。最终,我不会负责密钥或创建密钥的 Aws 帐户。我已经与创建帐户/密钥/角色的 IT 管理员保持联系,他向我保证,它们的创建方式与我创建开发帐户/密钥/角色的方式相同(这是开发之前商定的流程)。

可以通过 CLI 或 Web 控制台访问提供的帐户/密钥/角色,因此我可以确认它们有效并且处于活动状态。我一直努力不让任何 CLI 创建的凭据或配置文件在 sdk 默认情况下可能访问。

欢迎提出任何想法或建议。

【问题讨论】:

  • 您已成功授权,您的密钥是正确的,但它可能缺少访问某些资源所需的范围,这正是 403 的含义。
  • 嗯,密钥是正确的,这让人放心。关于范围,我认为 RoleARN 会定义它。在获取假定的角色凭据时,它不知道将请求什么资源(在这种情况下是预签名的 url)。有一个属性可以定义一个策略,但是这个角色有完全的访问权限,所以这有点违反直觉。

标签: amazon-web-services amazon-s3


【解决方案1】:

AWS返回这个错误的原因通常是密钥不正确

我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法。 (状态码:403;错误码:SignatureDoesNotMatch)

【讨论】:

    猜你喜欢
    • 2020-08-12
    • 2013-11-28
    • 2016-04-23
    • 2021-06-17
    • 1970-01-01
    • 2022-11-01
    • 1970-01-01
    • 2019-04-29
    • 1970-01-01
    相关资源
    最近更新 更多