You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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标准声明,必须手动添加颁发转换规则:

  1. 打开ADFS管理控制台,找到你的应用程序组(Application Group)。
  2. 编辑组内的Web应用程序,切换到「颁发转换规则」标签页。
  3. 点击「添加规则」,选择「发送LDAP属性作为声明」,点击「下一步」。
  4. 填写规则名称(比如「OIDC用户资料声明」),属性存储选择「Active Directory」。
  5. 配置LDAP属性到OIDC声明的映射:
    LDAP属性输出声明名称
    E-Mail-Addressesemail
    Given-Namegiven_name
    Surnamefamily_name
  6. 保存规则,重启ADFS服务(可选,但建议执行以确保配置生效)。

三、验证效果

修改后重新发起认证流程:

  1. 访问/login路由完成认证后,获取的access token中scp字段应包含openid、profile、email。
  2. 请求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和email scope被请求。

内容的提问来源于stack exchange,提问作者Victor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 09:03:16