【问题标题】:Authorization_IdentityNotFound on Microsoft Graph API requestMicrosoft Graph API 请求上的 Authorization_IdentityNotFound
【发布时间】:2021-01-22 21:09:53
【问题描述】:

我正在尝试在我的企业中开发一个应用程序,我已关注this tutorial 以访问 AD 用户信息。含义:

  1. 我在https://apps.dev.microsoft.com/ 中创建了一个应用程序
  2. 我在 Application Permissions 中设置了 User.Read.All,在 Delegated Permissions 中设置了 User.Read

完成此操作后,我能够成功登录(Azure AD OAuth2,https://graph.microsoft.com/ 作为资源,User.Read 作为范围)并从 https://graph.microsoft.com/v1.0/me 获得正确响应。

  1. 向管理员询问委派权限

这样,我的管理员可以在azure portal 中看到我的应用程序具有他自己同意的两个权限。

这是有效的,因为我要求一位同事登录并且我可以从 https://graph.microsoft.com/v1.0/me 得到正确的回复,即使他甚至没有被提示同意这一点(在管理员同意权限之前提示用户)

  1. https://login.microsoftonline.com/common/oauth2/token 请求令牌,以client_credentials 作为response_type

  2. 收到令牌!

  3. https://graph.microsoft.com/v1.0/users 发出 GET 请求并接收:

    {
        "error": {
            "code": "Authorization_IdentityNotFound",
            "message": "The identity of the calling application could not be established.",
            "innerError": {
                "request-id": "b2d9ec62-0b65-44eb-9e0f-4aec52b45750",
                "date": "2017-03-22T19:19:48"
            }
        }
    }
    

此外,向https://graph.microsoft.com/v1.0/me 发出请求会返回:

{
  "error": {
    "code": "BadRequest",
    "message": "Current authenticated context is not valid for this request",
    "innerError": {
      "request-id": "047e2ba9-a858-45fc-a0dd-124e1db503f3",
      "date": "2017-03-22T19:39:25"
    }
  }
}

这让我相信微软知道这个令牌并且知道它没有冒充任何用户。

我一直在寻找有关 Azure AD 和 Microsoft Graph 身份验证的文档,但我只找到博客文章,而且所有文章似乎都已过时(尽管大多数功能都处于预览状态)。 如果你能指出我正确的方向,我会感谢你。

我还在 SO 上发现了 thisthis 类似的问题,但它们都没有得到解答。

更新,this answer

谢谢你,丹, 我使用了我的组织域名,也可以获得令牌。

现在https://graph.microsoft.com/v1.0/users/ 的回复是:

{
  "error": {
    "code": "Authorization_RequestDenied",
    "message": "Insufficient privileges to complete the operation.",
    "innerError": {
      "request-id": "3f190b47-73f5-4b29-96f9-54ed3dbc3137",
      "date": "2017-03-23T11:07:15"
    }
  }
}

这没有任何意义,因为在 azure 门户中,我有 User.Read.All 作为应用程序权限(已经得到管理员的同意)。

我认为问题在于对令牌的请求,无论我发送scope,它都会成功返回,即使我编造了一个。

例如:

POST https://login.microsoftonline.com/<domain>/oauth2/token

client_id:*******
client_secret:*******
resource:https://graph.microsoft.com/
grant_type:client_credentials
scope:Foo.Bar

返回:

{
  "token_type": "Bearer",
  "expires_in": "3599",
  "ext_expires_in": "0",
  "expires_on": "1490271617",
  "not_before": "1490267717",
  "resource": "https://graph.microsoft.com/",
  "access_token": *****
}

【问题讨论】:

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


    【解决方案1】:

    我有两个问题,都没有涵盖文档:

    • 对于 客户端凭据,如果应用属于工作或学校(组织)上下文,则对于 https://login.microsoftonline.com/common/oauth2/token,将 common 替换为租户 ID 或域名(感谢 @987654321 @)

    • 对于https://graph.microsoft.com/v1.0/usershttps://graph.microsoft.com/v1.0/users/{id | userPrincipalName},您需要Directory.Read.All 权限。

    注意

    • 当您在 OAuth 工作流中请求 User.Read 时,User.Read.All 与 Microsoft 停止向用户请求权限(委托)相关。在Release Notes 中检查此问题和其他与权限相关的问题。
    • 我已将此 issue 添加到 Microsoft Graph Docs!

    【讨论】:

    • 谢谢。目录服务本身不支持 User.Read.All 应用程序权限。我们正在解决这个问题。不幸的是,我们的文档没有足够详细地说明 pre-req 权限是委托还是应用程序权限。对于读取用户,Directory 目前支持将 User.Read.All 作为委派权限,但不支持作为应用程序权限。感谢您提交文档问题。我也会在那里回复。
    【解决方案2】:

    /me 段是当前登录用户的快捷方式或别名。对/me 的请求永远不会与应用程序令牌一起使用,因为它不包含任何用户上下文(或登录用户)——因此会出现错误。不过,我们也许可以改善这个错误;)

    相信在使用客户端凭据流时,您需要指定您想要令牌的实际租户。

    如果您的应用在工作或学校(组织)上下文中执行此操作,那么对于 https://login.microsoftonline.com/common/oauth2/tokencommon 替换为租户 ID 或域名,看看是否可行。

    如果您关注 https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-v2-protocols-oauth-client-creds,看起来我们可能有几个文档错误需要修复...

    希望这会有所帮助,

    【讨论】:

    • 嗨,丹,感谢您的回答。我同意/me,我只是用它来说明一点。我已经根据您的回答更新了问题。此外,文档以/v1.0/me/messages 请求结尾(这毫无意义!!)
    • 我已经回答了这个问题,因为我终于设法解决了这个问题。如果你想根据我的更新你的答案,我会接受(使用域名的简单建议允许我调试:))明天我将清理我的问题,以便它可以作为其他人的参考,但我真的认为你应该处理文档。
    猜你喜欢
    • 2018-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多