【问题标题】:Microsoft graph and Azure Ad user authenticationMicrosoft 图形和 Azure Ad 用户身份验证
【发布时间】:2018-11-14 21:25:56
【问题描述】:

我在 Azure 广告中注册了一个应用程序。

当我使用以下详细信息执行 ADAL 时,我会获得一个授权令牌以与 microsoft graph api 一起使用。

    `username      = 'admin@domain.com'
    password      = 'password123'
    client_id     = application id from azure ad
    client_secret = keys from application on azure ad
    tenant        = directory id from azure ad`

使用此令牌,我可以获取我的 sharepoint 帐户中所有站点的列表。

下面是我调用的端点来获取带有不记名令牌的站点: https://graph.microsoft.com/v1.0/sites?search=*

但是当我只是使用使用以下端点生成的令牌进行客户端身份验证时,我无法访问站点列表。 login.microsoftonline.com/tenant_id/oauth2/v2.0/token

    `grant_type : client_credentials
    clientid : client_id
    clientsecrte : client_secret
    scope : https://graph.microsoft.com`

它不会返回所有网站。

有没有一种方法可以通过客户端身份验证获取所有站点列表。

或者我可以在没有用户密码的情况下获得一个用于用户身份验证的令牌。

这是我正在使用的解码令牌: { "aud": "https://graph.microsoft.com", "iss": "https://sts.windows.net/586145ec-0428-4da6-8061-fb114257ab70/", "iat": 1528949458, "nbf": 1528949458, "exp": 1528953358, "aio": "Y2dgYLh*************xAAA=", "app_displayname": "App Name", "appid": "504ddb16-2899-48be-be57-**********", "appidacr": "1", "idp": "https://sts.windows.net/586145ec-0428-4da6-8061-fb114257ab70/", "oid": "afcf166f-24c2-49f1-b285-b672d0413c50", "roles": [ "Sites.Read.All", "Sites.ReadWrite.All", "Sites.Manage.All", "Sites.FullControl.All", ], "sub": "afcf166f-24c2-49f1-b285-b672d0413c50", "tid": "586145ec-0428-4da6-8061-fb114257ab70", "uti": "hwYd8FZCH0KruWGRFiIHAA", "ver": "1.0" }

我还获得了其他权限,但这些权限与 Microsoft Graph api 中的网站相关

【问题讨论】:

  • 你能发布你得到的错误消息吗?成功的一个是使用ROPC流,它可以获得用户的onbehlaf委托权限。但是失败的是使用client_credentials 流,它获得了应用程序权限并且不能独立于用户。

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


【解决方案1】:

原因:

成功的是使用ROPC flow,它可以获得用户的委托权限 onbehlaf。但是失败的是使用client_credentials flow,它获得了应用程序权限并且不能代表用户。


更新答案

解决方案:(在进行此测试之前,请确保您的租户中拥有 SPO 许可证)

  1. 尝试在您注册的 AAD 应用程序中添加Sites.Read.All 应用程序权限,并在获得令牌之前为其征得管理员同意

  2. 如果您使用的是 AAD v1 端点,您可以通过单击授予权限按钮来征得管理员同意。如果您使用的是 v2 端点,请在您的 Internet 浏览器中输入此类 URL 以进行操作管理员授权:

    https://login.microsoftonline.com/{yourtenant}/adminconsent?client_id={the applicationid of your client}&state=123&redirect_uri={the redirect uri of your app}

并使用全局管理员帐户登录并接受此权限。

  1. 在我的测试实验室中,我使用了 v2 端点。这是我通过 Postman 获得的令牌:

这里是https://jwt.ms中的解码token,我们可以对token进行解码以确保它拥有我们想要的权限。

  1. 然后我在头部使用这个token调用Microsoft Graph API并成功:

有关 Microsoft Graph 站点权限的更多详细信息,请参阅this documentation

如果这有帮助,请告诉我!

【讨论】:

  • 我已授予 Sites.Read.All 权限。使用 client_credentials 流时我没有收到任何错误,但没有获得 sharepoint 帐户中所有站点的列表。它只是向我发送主租户站点的子站点。请你帮我看看。在 azure 广告帐户中,我已授予所有权限应用程序并委托给该应用程序。
  • @SurajShelke - 我有完全相同的问题。使用app only认证,使用graph的sites/search api调用时,并非所有站点都返回。
  • 嗨@SurajShelke,我将对这个问题进行深入测试并随时为您更新。
  • 嘿,谢谢@WayneYang-MSFT 期待收到您的来信。 ruelloehr,如果您可以在站点查询之前让用户登录或者可以从用户那里获取密码,那么您可以使用 grant_type 作为密码,这样可以正常工作。
  • 嗨@SurajShelke,我已经更新了我的答案。在我的测试实验室中,我使用 v2 端点来执行此操作,但其结果应该与 v1 端点相同。我可以列出我租户中的站点。您可以查看此答案,看看它是否对您的方案有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-26
  • 2019-01-17
  • 2023-01-14
  • 2022-10-07
  • 1970-01-01
  • 2019-04-22
相关资源
最近更新 更多