【发布时间】:2022-06-10 22:30:47
【问题描述】:
我正在将使用 OAuth2 的内部开发的单页应用程序 (Typescript/React) 从 AD-FS 2016 更新到 Azure AD v2。由于我(开发人员)没有直接访问 Azure 控制台的权限,并且正在与一个(非开发人员)系统管理员一起工作,因此事情稍微复杂了一些。
我已经实现了 PKCE 并让流程正常工作;我现在可以从服务器获取 JWT 访问、ID 和刷新令牌,并通过 JWKS 对它们进行身份验证。到目前为止一切顺利。
现在,我的应用了解更多内容:
- 是否应将用户视为管理员。这是从组成员身份推断出来的
- 用户的首选用户名和名字/姓氏
我们通过设置“角色”并将其映射到 Azure 控制台中的组来处理其中的第一个问题。然后我们将角色声明添加到令牌中。我可以在“id_token”中找到它作为字符串数组。没问题。
我迷茫了一阵子,因为我在“access_token”中寻找它,但我的应用程序使用“id_token”代替它不是问题。
第二个是真正给我们带来问题的东西。无论我们在“可选声明”对话框中添加什么 - 我们已经添加了所有这些字段以及更多,对于 ID 令牌,它们不会出现在其中。我们所做的一切似乎都不会影响实际出现的代币。
我开始认为我在获取信息方面遗漏了一些东西。我正在使用https://graph.microsoft.com/profile、https://graph.microsoft.com/email 和https://graph.microsoft.com/user.read 范围,并且管理员已代表应用程序授权这些范围。用户从我们的内部活动目录同步,AD-FS 也从该目录运行,所以我知道这些信息在那里。我尝试弄乱resource 参数,但这显然在 Azure AD v2 中已被弃用。
我已经阅读并重新阅读 https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-optional-claims 以及其他在线文档,以下段落让我感到困惑,让我认为问题可能与范围有关:
访问令牌始终使用资源清单生成,而不是客户端。因此,在请求 ...scope=https://graph.microsoft.com/user.read... 中,资源是 Microsoft Graph API。因此,访问令牌是使用 Microsoft Graph API 清单创建的,而不是客户端的清单。更改应用程序的清单永远不会导致 Microsoft Graph API 的令牌看起来不同。为了验证您的 accessToken 更改是否生效,请为您的应用程序请求一个令牌,而不是另一个应用程序。
或者这就是我改用id_token的原因?
配置清单的optional_claims 部分如下所示:
"optionalClaims": {
"idToken": [
{
"name": "email",
"source": null,
"essential": false,
"additionalProperties": []
},
{
"name": "upn",
"source": null,
"essential": false,
"additionalProperties": []
},
{
"name": "groups",
"source": null,
"essential": false,
"additionalProperties": []
},
{
"name": "family_name",
"source": null,
"essential": false,
"additionalProperties": []
},
{
"name": "given_name",
"source": null,
"essential": false,
"additionalProperties": []
},
{
"name": "preferred_username",
"source": null,
"essential": false,
"additionalProperties": []
}
],
"accessToken": [
{
"name": "email",
"source": null,
"essential": false,
"additionalProperties": []
},
{
"name": "groups",
"source": null,
"essential": false,
"additionalProperties": []
},
{
"name": "preferred_username",
"source": null,
"essential": false,
"additionalProperties": []
}
],
"saml2Token": [
{
"name": "groups",
"source": null,
"essential": false,
"additionalProperties": []
}
]
},
但 ID 标签中的结果负载如下所示:
{
"aud": "redacted",
"iss": "https://login.microsoftonline.com/redacted/v2.0",
"iat": 1654770319,
"nbf": 1654770319,
"exp": 1654774219,
"email": "redacted",
"groups": [
"redacted",
"redacted",
"redacted",
"redacted"
],
"rh": "redacted",
"roles": [
"redacted"
],
"sub": "redacted",
"tid": "redacted",
"uti": "redacted",
"ver": "2.0"
}
任何对该平台有更多经验的人可以帮助我了解我们在这里做错了什么吗?我们需要定义自定义范围吗?我们只是忘记打开一个选项了吗?
感谢所有帮助!提前谢谢...
【问题讨论】: