【问题标题】:OpenId Connect Authentication & Azure AD Scopes ConfusionOpenId Connect 身份验证和 Azure AD 范围混淆
【发布时间】:2023-03-20 11:37:02
【问题描述】:

我试图了解我在 OpenIdConnectAuthenticationOptions 的 Scope 属性中请求的范围与我的访问令牌中返回的内容之间的相关性。

当我只请求“openid 个人资料”时,我会获得所有已获得用户或管理员同意的范围。此外,返回的访问令牌版本似乎取决于范围请求。例如,如果我包含我注册的“api://........”。我相信我的 web 应用程序和 api 都在清单中配置为版本 2。

例如:“openid profile”在我的访问令牌中返回范围“Directory.Read.All Group.Read.All User.Read profile openid email”。

某些范围会自动映射到其他范围,还是有一些逻辑?就我自己的理解而言,我试图找出一些合乎逻辑的因果关系。

【问题讨论】:

    标签: azure-active-directory azure-ad-graph-api


    【解决方案1】:

    当您仅将“openid profile”放入范围时,访问令牌“Directory.Read.All Group.Read.All User.Read profile openid email”中的默认范围默认适用于 Microsoft Graph API。这是设计使然。

    因为此访问令牌用于call the UserInfo endpoint,其中用户信息实际上来自Microsoft Graph。

    当您将“api://........”放入范围时,访问令牌将用于您的 API 应用程序。访问令牌中有一个aud 声明,用于标识令牌的预期接收者。你可以检查一下。

    【讨论】:

    • 所以添加我的 api://..... 范围请求的行为会自动覆盖其他范围,并表示仅为我的 API 生成访问令牌?默认情况下,MS Graph 访问令牌也是 v1 令牌吗?我注意到,当它只是一个图形标记时,它是 v1。也许这无关紧要,但我很好奇我是否错过了什么。
    • @MViglainco 一般情况下,您在scope 中输入的第一个将生效。例如“api://..... user.read”,第一个用于您的 API,第二个用于 Graph。在这种情况下,访问令牌用于您的 API。但这不是设置scope 的推荐方式。一个令牌用于一种资源。所以我们不应该放置来自不同资源的多个权限。 MS Graph 访问令牌默认为 v1,无法更改为 v2。自定义 API 访问令牌可以转换为 v2。
    • 再次感谢。这就说得通了。当您需要多个资源的访问令牌时,您知道如何处理任何资源吗?如果我的理解是正确的,那似乎是不可能的。登录时,您将身份验证代码和客户端 ID/秘密交换为访问令牌。我的理解是代码是一次性使用的。那么如何获取其他资源令牌呢?此时我手头的刷新令牌仅对原始资源有效。
    • @MViglainco 您可以使用手头的刷新令牌通过将scope 指定为“其他资源”来使用“其他资源”调用/token 端点。例如,当前的访问令牌和刷新令牌是为您自己的 API 准备的。您可以像这样client_id=6731de76-14a6-49ae-97bc-6eba6914391e&scope=https%3A%2F%2Fgraph.microsoft.com%2Fmail.read &refresh_token=OAAABAAAAiL9Kn2Z27UubvWFPbm0gLWQJVzCTE9UkP3pSx1aXxUjq...&grant_type=refresh_token&client_secret=JqQX2PNo9bpM0uEihUPzyrh 调用/token。在这种情况下,新的访问令牌适用于 Microsoft Graph。
    • @MViglainco 在此处刷新令牌文档:docs.microsoft.com/en-us/azure/active-directory/develop/…
    猜你喜欢
    • 2021-07-29
    • 2015-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-14
    • 1970-01-01
    • 2020-05-28
    • 2021-09-07
    相关资源
    最近更新 更多