如何区分Cognito用户池同一邮箱用户的社交与SAML外部提供商登录?
Cognito区分SAML与社交登录并限制企业账户访问的实现方案
以下是几个可行的实现思路:
1. 用自定义用户属性标记登录来源
- 用户首次通过第三方登录时,借助Cognito的预注册触发器,从
event.request.userAttributes里的identities字段提取提供商类型(比如providerName是AzureAD就归为SAML,Google/Facebook归为社交),给用户添加一个自定义属性(比如custom:auth_provider_type),值设为saml或social。 - 也可以用后认证触发器每次登录时确认或更新这个属性,防止被篡改。
- 后续访问企业账户时,检查用户的这个自定义属性,只允许
saml标记的用户进入。
2. 通过Cognito组划分用户类型
- 创建两个Cognito用户组:
Enterprise_Users(仅SAML登录用户加入)和Social_Users(社交登录用户)。 - 同样用预注册或后认证触发器,根据登录提供商类型把用户分配到对应组。比如检测到是SAML提供商登录,就把用户加入
Enterprise_Users组。 - 在应用或API的授权逻辑里,只允许
Enterprise_Users组的用户访问企业账户资源。
3. 解析ID Token验证登录提供商
- Cognito签发的ID Token里自带
identities字段,里面的providerName会明确显示用户是通过哪个提供商登录的。 - 应用端验证ID Token的有效性后,解析这个字段,确认是指定的SAML服务商(比如Azure AD)才允许访问企业账户,社交提供商登录的直接拒绝。
- 注意必须验证ID Token的签名,防止被伪造篡改,用Cognito的公钥就能做验证。
4. 身份池角色映射控制权限(若用联合身份)
- 如果用Cognito身份池做联合身份管理,可以给不同的身份提供商配置不同的IAM角色:SAML提供商映射到有企业账户访问权限的角色,社交提供商映射到无权限的角色。
- 用户访问企业资源时,通过IAM角色的权限来控制,只有SAML对应的角色能获取访问权限。
内容的提问来源于stack exchange,提问作者David Meléndez
相关产品推荐
相关产品推荐

