首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用Facebook AssumeRoleWithWebIdentity凭据访问AWS

无法使用Facebook AssumeRoleWithWebIdentity凭据访问AWS
EN

Stack Overflow用户
提问于 2013-07-01 11:01:04
回答 1查看 755关注 0票数 1

短版

作为Facebook用户登录,我使用我的oAuth令牌来假设IAM在AWS中的作用。它返回看起来是有效的凭据,例如,有一个与我们的主键长度相似的AccessKeyId,SecretAccessKey。

当我尝试使用这些凭据访问DynamoDB表时,我得到两个例外之一:

  1. "The remote server returned an error: (400) Bad Request.";或
  2. "The security token included in the request is invalid."

我正在使用AWS C# SDK版本1.5.25.0

长版本

如前所述,我正试图使用DynamoDB身份授权的AmazonSecurityTokenServiceClient提供的凭据访问AWS上的这个AWS指南表,如这个AWS指南中所述。

我创建的IAM角色的策略是:

代码语言:javascript
复制
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "dynamodb:BatchGetItem",
        "dynamodb:PutItem",
        "dynamodb:Query",
        "dynamodb:Scan",
        "dynamodb:UpdateItem"
      ],
      "Sid": "Stmt1372350145000",
      "Resource": [
        "*"
      ],
      "Effect": "Allow"
    }
  ]
}

如何获得凭据:

  1. 用户使用oAuth登录Facebook。
  2. 使用访问令牌,我使用带有请求的AmazonSecurityTokenServiceClient.AssumeRoleWithWebIdentity来承担IAM角色。
  3. 这将返回看起来是有效凭据的内容,例如,与主键长度相似的AccessKeyId、SecretAccessKey。 使用(var AmazonSecurityTokenServiceClient(RegionEndpoint.USEast1)) =新"arn:aws:iam::193557284355:role/Facebook-OAuth",{ var tokenServiceClient =新AssumeRoleWithWebIdentityRequest { DurationSeconds = (int)TimeSpan.FromHours(1).TotalSeconds,ProviderId = "graph.facebook.com",RoleArn =“arn:aws:iam::193557284355:role/Facebook-OAuth”,RoleSessionName = result.id,WebIdentityToken = FBClient.AccessToken };var response = tokenServiceClient.AssumeRoleWithWebIdentity(request);AWSAssumedRoleUser = response.AssumeRoleWithWebIdentityResult.AssumedRoleUser;)response.AssumeRoleWithWebIdentityResult.Credentials;= AWSCredentials }

如何使用这些凭据:

然后使用返回的凭据,尝试访问AWS DynamoDB资源。

代码语言:javascript
复制
using (var client = new AmazonDynamoDBClient(AWSCredentials.AccessKeyId, AWSCredentials.SecretAccessKey, AWSCredentials.SessionToken, RegionEndpoint.USEast1))
{
    var context = new DynamoDBContext(client);
    var data = context.Scan<SomeData>();    
}

这将在尝试对表进行"The remote server returned an error: (400) Bad Request."时返回Scan

这是异常消息的变化所在;如果我从上面的AWSCredentials.SessionToken中省略了该AmazonDynamoDBClient

代码语言:javascript
复制
using (var client = new AmazonDynamoDBClient(AWSCredentials.AccessKeyId, AWSCredentials.SecretAccessKey, RegionEndpoint.USEast1))
{
    var context = new DynamoDBContext(client);
    var data = context.Scan<SomeData>();
}

这将在尝试对表进行"The security token included in the request is invalid."时返回Scan

问题

此时,我无法判断是什么错了,凭据是否无效,或者我并没有将所有需要传递给AWS的内容都传递给AWS。

有人能提供任何关于哪里出了问题或者我如何进一步调试的洞察力吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-02 09:44:49

我在AWS论坛上交叉发布了我的问题,并从亚马逊的工程师那里得到了答案。

https://forums.aws.amazon.com/message.jspa?messageID=465057

DynamoDBContext对象调用目标表上的DescribeTable (并缓存该数据,因此为了获得最佳性能,您希望尽可能长时间地保持上下文对象,因此每个目标表只进行一次调用)。修改策略如下:

代码语言:javascript
复制
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "dynamodb:BatchGetItem",
        "dynamodb:PutItem",
        "dynamodb:Query",
        "dynamodb:Scan",
        "dynamodb:UpdateItem",
        "dynamodb:DescribeTable"        
      ],
      "Sid": "Stmt1372350145000",
      "Resource": [
        "*"
      ],
      "Effect": "Allow"
    }
  ]
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17402889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档