我正在开发一个项目,尝试使用 Azure Entra ID 中的授权代码流生成令牌。我创建了自定义范围并尝试将这些范围包含在令牌中。在启动授权时,我使用 scopes 查询参数包含所需的范围。每次我添加新范围时都会提示同意屏幕。我同意用户所请求的范围。我观察到,Azure Entra ID 包含用户在令牌内已同意的范围,即使我在启动授权时没有请求它们。
例如,
首次生成代币 我包括了 3 个范围,即患者、从业者和观察。 成功进行身份验证和授权后,会在 scp 声明内生成具有 3 个范围的令牌。
第二次生成代币 我包括了 3 个范围,即患者、观察和状况 成功验证和授权后,会在 scp 声明内生成一个具有 4 个范围的令牌。
尽管请求了 3 个瞄准镜,但我还是收到了 4 个瞄准镜。额外的范围是我在第一次生成Token时同意的实践者范围。
我在 google 上搜索了 Azure Entra ID 用于管理范围的行为,但找不到任何相关信息。
任何人都可以澄清上述行为以及我对在令牌内添加同意范围(即使没有请求)的观察。如果我的观察是正确的,您能否指出可以证明这一点的链接或文档。任何帮助都会对我有很大帮助。
Azure Entra ID 包括之前在访问令牌中授予应用程序的所有范围,而不仅仅是当前请求中的范围。这就是为什么您会在令牌中看到先前同意的范围,即使当前请求中没有请求它们。此行为是设计使然,旨在减少用户同意提示的数量。
当用户或管理员同意应用程序的一组权限时,这些权限将被授予该用户上下文中的应用程序。如果应用程序稍后请求这些权限的子集,则颁发的令牌仍将包含已授予该用户的应用程序的所有权限。这意味着,如果您最初同意三个范围,然后在后续令牌请求中仅请求两个范围,则令牌可能仍包含所有三个范围,因为第三个范围的同意仍然有效。
此行为与 Microsoft 身份平台中的静态 (
.default
) 和动态同意的概念相关。当在范围请求中使用 .default
时,它本质上是在请求“已授予此应用程序的所有静态权限”。如果已针对一组范围授予明确同意,则带有 .default
的令牌请求将生成包含所有这些范围的令牌。
为了避免请求不必要的范围,建议仅请求当前操作所需的范围。当应用程序执行需要这些范围的操作时,您可以逐步请求更多范围。
参考资料: