如何在Keycloak中将用户属性映射至标准OIDC声明?
Keycloak请求phone scope后的声明返回问题解答
你的预期部分正确:
phone_number声明能正常返回符合预期,但phone_number_verified不会自动返回,需要额外配置。
1. 关于phone_number的预期合理性
你在Keycloak的Realm Settings > User Profile中添加了手机号属性,同时客户端请求了标准phone scope,Keycloak会自动将用户的手机号映射到OIDC标准的phone_number声明,这和你当前令牌中的结果一致,完全符合OIDC协议对phone scope的定义。
2. 为什么phone_number_verified不会自动返回
Keycloak默认不会生成phone_number_verified声明,哪怕你请求了phone scope,原因是:
- 该声明依赖用户的
phoneNumberVerified属性,但Keycloak默认没有开启这个用户属性,也不会自动将其映射到令牌中。
要让phone_number_verified出现在令牌里,需要完成以下配置:
- 步骤1:添加用户属性
进入Realm Settings > User Profile,添加一个名为phoneNumberVerified的属性,类型选择boolean,并确保该属性在注册表单中可见(如果需要用户自主设置)。 - 步骤2:配置声明映射
进入客户端对应的Client Scopes,找到phonescope并进入其Mappers标签页,添加新的映射器:- 类型选择
User Attribute - 属性名填写
phoneNumberVerified - Token Claim Name填写
phone_number_verified - 根据需求勾选
Add to ID token和Add to access token
- 类型选择
- 步骤3:设置用户属性值
在用户详情的Attributes页面,给目标用户设置phoneNumberVerified的值为true或false。
3. AspNet Core配置的补充调整
你当前的配置中写了options.ClaimActions.MapJsonKey("phone_verified", "phone_verified");,但OIDC标准的声明名是phone_number_verified,建议修改为:
options.ClaimActions.MapJsonKey("phone_number_verified", "phone_number_verified"); // 或者映射到.NET标准声明类型 options.ClaimActions.MapJsonKey(ClaimTypes.MobilePhoneVerified, "phone_number_verified");
内容的提问来源于stack exchange,提问作者user23137927
相关产品推荐
相关产品推荐

