AWS Cognito User Pool SAML是否支持SCIM(ADFS)及实现示例咨询
1. Cognito User Pool 适配ADFS SAML场景的SCIM支持说明
Cognito User Pool 原生的SAML联邦认证模块没有内置开箱即用的SCIM 2.0服务端能力,你没法直接把ADFS的SCIM同步端点指向Cognito就完成用户生命周期自动同步。
但这个场景的SCIM能力完全可以落地,不存在技术卡点:SAML模块本身只负责联邦登录的断言校验、会话建立,SCIM需要的用户增删改查同步能力,可以通过AWS原生服务搭配Cognito公开的管理API实现,不需要依赖第三方工具。
这里要先区分容易搞混的能力:Cognito SAML默认带JIT(即时预置)能力——用户第一次从ADFS走SAML登录时,会自动在User Pool里创建对应用户,但这个能力不支持反向/增量同步:ADFS侧禁用用户、删除用户、修改用户属性时,Cognito侧的对应数据不会自动更新,这部分就是SCIM需要补全的能力。
2. 具体实现操作示例
整个方案全用AWS原生组件搭建,不需要额外购置服务器,核心分三步:
前置准备
先完成Cognito和ADFS的基础SAML联邦对接,确认用户可以通过ADFS SSO正常登录Cognito接入的应用,记录好Cognito User Pool ID,提前梳理好需要同步的用户属性映射规则(比如邮箱、显示名、工号、部门这些字段和AD属性的对应关系)。
第一步:搭建SCIM协议适配层
用Lambda + API Gateway搭建符合SCIM 2.0规范的接口层,只需要实现ADFS SCIM客户端强制调用的4个核心接口即可,不需要覆盖全量SCIM规范:
GET /Users:查询Cognito内的用户信息,供ADFS做用户存在性校验POST /Users:ADFS侧创建用户时,调用Cognito的AdminCreateUser接口创建对应用户PATCH /Users/{id}:ADFS侧更新用户属性、禁用/启用用户时,调用Cognito的AdminUpdateUserAttributes、AdminDisableUser、AdminEnableUser接口完成对应操作DELETE /Users/{id}:ADFS侧删除用户时,调用Cognito的AdminDeleteUser接口删除对应账号
给个Lambda处理用户创建请求的核心Python代码片段参考:
import boto3 cognito_client = boto3.client('cognito-idp') # 替换为你自己的Cognito User Pool ID USER_POOL_ID = "ap-northeast-1_xxxxxxxxx" def lambda_handler(event, context): # 解析ADFS发送的SCIM标准请求体 req_data = event.get("body", {}) user_email = req_data["emails"][0]["value"] display_name = req_data.get("displayName", "") # 调用Cognito接口创建用户 create_resp = cognito_client.admin_create_user( UserPoolId=USER_POOL_ID, Username=user_email, UserAttributes=[ {"Name": "email", "Value": user_email}, {"Name": "name", "Value": display_name}, {"Name": "email_verified", "Value": "true"} ], # 关闭Cognito默认的邀请邮件,账号通知由AD域统一管理 MessageAction="SUPPRESS" ) # 返回符合SCIM规范的响应给ADFS return { "statusCode": 201, "body": { "id": create_resp["User"]["Username"], "userName": user_email, "emails": [{"value": user_email, "primary": True}], "displayName": display_name } }
接口部署完成后,给API Gateway配置访问密钥,后续填到ADFS的SCIM配置页即可。
第二步:配置ADFS侧SCIM同步规则
在ADFS的SCIM预置配置页填入你部署的API Gateway端点、访问密钥,把需要同步的AD属性和SCIM接口的字段做一一映射,注意字段名要和Cognito User Pool里定义的属性(包括自定义属性)完全匹配,避免同步时字段丢失。
第三步:同步逻辑校验
分别在ADFS侧执行创建测试用户、修改用户属性、禁用用户、删除用户操作,到Cognito控制台核对对应用户的状态、属性是否同步更新,同时验证变更后的用户走SAML登录是否符合预期。
小提示:如果你的用户规模小于1000人,对同步实时性要求不高,也可以不用搭标准SCIM接口,直接写个定时Lambda脚本每天拉取一次AD侧的用户全量数据,批量和Cognito User Pool里的用户做比对更新就行,实现成本更低。
内容的提问来源于stack exchange,提问作者Dennis Liger

