如何将Azure AD的Claims添加到Keycloak的KEYCLOAK_IDENTITY令牌中?
问题解决步骤
1. 校验身份提供商声明映射配置
进入Keycloak控制台对应Realm → 身份提供商 → 选择Azure AD → 声明映射:
- 针对
groups:添加映射,声明来源填groups,目标选择「用户属性」(属性名设为groups),或直接映射到Keycloak Realm/客户端角色(需确保Keycloak中存在对应角色,或开启「创建如果不存在」)。 - 针对
roles:同理,将Azure的roles声明映射到Keycloak角色或用户属性。
2. 配置客户端/Realm范围的声明输出
- 进入Realm → 客户端范围 → 选择默认
roles范围(或自定义范围):- 在「声明」标签页,添加自定义声明:
- 名称
groups,来源选「用户属性」,属性名称填groups; - 名称
roles,来源选「角色列表」,按需选择「Realm角色」或「客户端角色」。
- 名称
- 确保你的业务客户端已关联该客户端范围。
- 在「声明」标签页,添加自定义声明:
3. 明确KEYCLOAK_IDENTITY的用途
KEYCLOAK_IDENTITY是Keycloak内部会话管理Cookie,默认不会包含所有用户声明。若需获取groups和roles,应通过以下方式:
- 调用Keycloak的
/realms/{realm}/protocol/openid-connect/userinfo端点,查看返回的用户信息; - 获取Keycloak颁发的Access Token或ID Token,这些令牌才会包含配置好的自定义声明。
4. 使用脚本映射器强制同步声明
若常规映射无效,添加脚本映射器:
- 进入身份提供商 → Azure AD → 映射器 → 添加映射器 → 选择「脚本映射器」;
- 填入以下脚本:
// 同步Azure groups到用户属性 var azureGroups = user.getAttribute('groups'); if (azureGroups) { user.setSingleAttribute('groups', azureGroups); } // 同步Azure roles到Realm角色 var azureRoles = user.getAttribute('roles'); if (azureRoles) { var realm = session.getContext().getRealm(); azureRoles.forEach(function(roleName) { var targetRole = realm.getRole(roleName); if (targetRole) { user.grantRole(targetRole); } }); } - 保存后重新登录测试。
5. 验证Azure AD应用配置
进入Azure Portal → Azure AD → 企业应用 → 你的应用 → 单一登录 → 用户属性和声明:
- 确认
groups和roles声明已正确添加,且配置了正确的返回格式(如组ID、角色名称)。
内容的提问来源于stack exchange,提问作者Jananath
相关产品推荐
相关产品推荐

