ADFS 2016 OAuth2保密应用缺失用户信息,如何获取邮箱等资料?
解决ADFS 2016无法获取用户资料的问题
要获取email、name和surname字段,需要从代码修改和ADFS服务器配置两方面入手:
一、修改Node.js代码请求额外权限
当前代码仅请求了openid基础权限,只能拿到用户唯一标识sub。需要添加profile和email标准scope,告知ADFS你需要用户的基本资料与邮箱信息:
修改/login路由中的scope参数:
const queryParams = new URLSearchParams({ response_type: "code", client_id: CLIENT_ID, redirect_uri: redirectUri, resource: "urn:microsoft:userinfo", scope: "openid profile email" // 新增profile和email权限范围 });
二、配置ADFS服务器的声明映射
ADFS 2016不会自动将Active Directory(AD)中的用户属性映射到OIDC标准声明,必须手动添加颁发转换规则:
- 打开ADFS管理控制台,找到你的应用程序组(Application Group)。
- 编辑组内的Web应用程序,切换到「颁发转换规则」标签页。
- 点击「添加规则」,选择「发送LDAP属性作为声明」,点击「下一步」。
- 填写规则名称(比如「OIDC用户资料声明」),属性存储选择「Active Directory」。
- 配置LDAP属性到OIDC声明的映射:
LDAP属性 输出声明名称 E-Mail-Addresses email Given-Name given_name Surname family_name - 保存规则,重启ADFS服务(可选,但建议执行以确保配置生效)。
三、验证效果
修改后重新发起认证流程:
- 访问
/login路由完成认证后,获取的access token中scp字段应包含openid、profile、email。 - 请求userinfo端点时,返回的数据会包含
email、given_name(对应name)、family_name(对应surname)字段。
另外,你也可以直接解析id_token获取这些信息(无需调用userinfo端点),示例代码:
const jwt = require('jsonwebtoken'); // 在获取token响应后: const idToken = response.data.id_token; const userClaims = jwt.decode(idToken); console.log(userClaims.email, userClaims.given_name, userClaims.family_name);
注意:确保ADFS应用程序组的OAuth设置中,已允许
profile和
内容的提问来源于stack exchange,提问作者Victor
相关产品推荐
相关产品推荐

