You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Azure AD生成的OAuth访问令牌认证AWS Python SDK(Boto3)以访问配置了Azure AD SSO的S3存储桶?

使用Azure AD OAuth令牌认证Boto3访问S3

前提准备

我之前帮团队配置过这套流程,先提醒你得先完成这两项核心配置:

  • Azure AD中已创建指向AWS的企业应用,且配置了正确的权限映射规则
  • AWS IAM中创建了允许Azure AD身份扮演的角色,该角色拥有目标S3桶的访问权限,同时信任策略已配置为信任Azure AD的OIDC提供商

步骤1:从Azure AD获取OAuth访问令牌

你可以用Python的requests库直接调用Azure的令牌端点拿令牌,示例代码如下:

import requests

tenant_id = "你的Azure租户ID"
client_id = "你的Azure AD客户端ID"
client_secret = "你的Azure AD客户端密码"
token_endpoint = f"https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token"

payload = {
    "grant_type": "client_credentials",
    "client_id": client_id,
    "client_secret": client_secret,
    "scope": "https://aws.amazon.com/.default"  # 这个scope要和Azure AD应用配置完全匹配
}

response = requests.post(token_endpoint, data=payload)
response.raise_for_status()
azure_access_token = response.json()["access_token"]

补充:如果你的场景是用户级SSO(而非服务对服务),就得换成authorization_code授权类型,这时候需要引导用户完成Azure的登录流程获取授权码,再换取令牌。


步骤2:用Azure令牌获取AWS临时凭证并初始化Boto3

拿到Azure的访问令牌后,通过AWS STS的AssumeRoleWithWebIdentity API获取临时凭证,再用这个凭证创建S3客户端:

import boto3

# 初始化STS客户端
sts_client = boto3.client('sts')

# 调用AssumeRoleWithWebIdentity
role_arn = "arn:aws:iam::你的AWS账号ID:role/允许Azure扮演的IAM角色名"
role_session_name = "azure-ad-sso-s3-session"  # 自定义会话名,方便后续审计

response = sts_client.assume_role_with_web_identity(
    RoleArn=role_arn,
    RoleSessionName=role_session_name,
    WebIdentityToken=azure_access_token
)

# 提取临时凭证
temp_credentials = response['Credentials']

# 用临时凭证初始化S3客户端
s3_client = boto3.client(
    's3',
    aws_access_key_id=temp_credentials['AccessKeyId'],
    aws_secret_access_key=temp_credentials['SecretAccessKey'],
    aws_session_token=temp_credentials['SessionToken']
)

# 测试访问S3桶(可选)
bucket_name = "你的目标S3桶名"
response = s3_client.list_objects_v2(Bucket=bucket_name)
print("桶内对象列表:", [obj['Key'] for obj in response.get('Contents', [])])

关键注意事项

  • IAM角色信任策略:一定要确保IAM角色的信任策略正确配置,示例片段如下,限制只有指定的Azure AD客户端能扮演该角色:
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "arn:aws:iam::你的AWS账号ID:oidc-provider/login.microsoftonline.com/你的Azure租户ID/v2.0"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "login.microsoftonline.com/你的Azure租户ID/v2.0:aud": "你的Azure AD客户端ID"
            }
          }
        }
      ]
    }
    
  • 令牌有效期:Azure AD的客户端凭证令牌默认有效期1小时,AWS临时凭证最长可设置为1小时(可通过DurationSeconds参数调整,不超过角色设置的最大值),所以要记得在令牌过期前重新获取并刷新凭证。
  • 权限映射:Azure AD应用中要配置正确的AWS权限映射,确保Azure AD的身份能对应到指定的AWS IAM角色。

内容的提问来源于stack exchange,提问作者Ara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 19:59:09