【问题标题】:Set the scope parameter for Microsoft Graph设置 Microsoft Graph 的范围参数
【发布时间】:2017-08-08 23:03:11
【问题描述】:

我已经用apps.dev.microsoft.com注册了一个应用程序

并将其权限设置为:

我正在获得一个使用 Microsoft Graph API 的令牌,如下所示:

https://developer.microsoft.com/en-us/graph/docs/concepts/auth_v2_service#4-get-an-access-token

我将范围设置为:scope=https://graph.microsoft.com/.default

我在没有Directory.ReadWrite.All 许可的情况下取回了一个令牌。

如何修改请求以取回具有apps.dev.microsoft.com 门户下指定权限的令牌?我应该更改范围参数吗?

我按照网上的建议尝试了graph.microsoft.com/directory.readwrite.all,但没有任何运气。

【问题讨论】:

  • 几个问题:1) 您是否通过了管理员同意程序? 2) 您能否提供您正在使用的完整 URL(减去您的实际客户端 ID)3) 您能否提供您在身份验证期间获得的响应?
  • @MarcLaFleur-MSFT: 1. 不需要管理员同意流程,因为我的用户是应用程序的所有者。还是我弄错了? 2.)我正在调用 login.microsoftonline.com/#{tenant}/oauth2/v2.0/token,标题为:'Content-type' => 'application/x-www-form-urlencoded' 和正文:client_id: XYZ, scope: 'https://graph.microsoft.com/.default', client_secret: XZYY, grant_type: 'client_credentials' 3)对于上面的调用,我没有收到任何错误,但 JWT 令牌不包含Directory.ReadWrite.All 的权限。
  • @MarcLaFleur-MSFT 如果我尝试使用上述范围,我会得到:Message: 400, Bad Request, {\"error\":\"invalid_scope\",\"error_description\":\"AADSTS70011: The provided value for the input parameter 'scope' is not valid. The scope https://graph.microsoft.com/Directory.ReadWrite.All is not valid....
  • @MarcLaFleur-MSFT,我已经重新同意管理员,现在 JWT 的角色是:"roles": [ "User.ReadWrite.All", "People.Read.All", "Directory.ReadWrite.All", "User.Invite.All", "User.Read.All" ],但我仍然得到 Authorization_RequestDenied。我试图调用 POST 到端点 /schemaExtensions
  • 我还发现了这个帖子here。图形浏览器当前是否支持向用户实体添加 schemaExtensions 的功能?我同意,这是一次性交易,无需在应用程序中实施。

标签: microsoft-graph-api


【解决方案1】:

要使用schemaExtentions,您需要Directory.AccessAsUser.All 范围。但是,您在这里遇到的问题是您正在使用仅支持应用程序权限(其中Directory.AccessAsUser.All 不是其中之一)的client_credentials 授权(又名“App-Only 身份验证”)。

为了使用任何委托权限,您需要对用户进行身份验证,而不仅仅是对应用程序进行身份验证。委派权限就是用户在一段时间内委派(也称为转移/分配)给您的应用程序的权限。

这里有几个选项。如果您遇到的唯一问题是schemaExtentions,并且您不是在销售商业解决方案(ISV),那么您很可能一开始就不需要将其纳入您的应用程序。相反,请尝试使用Graph Explorer 创建它们。

请注意,您需要先执行 Graph Explorer 的管理员同意,然后才能与您的租户合作。

另一种选择是在应用程序中同时支持client_credentialcode 授权。如果您是销售商业解决方案的 ISV,这可能是最好的选择。执行此操作的最简洁方法是拥有一个由管理员执行的“设置”应用程序。管理员使用code 授权对自己进行身份验证,然后您创建所有需要的扩展。这个过程的好处是它提供了一个干净且合乎逻辑的地方来启动您将需要用于生产应用程序的client_credential 授权的管理员同意。

需要注意的一点是,您可以为Auth CodeImplicitClient Credential 授予使用相同的 App ID。根据您选择的授权,它将使用您定义的委托或应用程序权限。这使得上述场景非常简单。

遗憾的是,注册 UX 并没有很好地展示委托与应用程序权限的应用方式,导致许多用户认为这两个集合始终都在使用。实际上,根据使用的授权类型,只有一组适用。一个例外是管理员同意,它同意所有请求的权限(即您不需要单独的委托和应用程序同意流程)。

【讨论】:

  • 感谢您详尽的回复!我想用 Graph 工具来做,但即使有了它我也做不到。我使用我的帐户登录并授予权限(Directory.AccessAsUser.All,Directory.Read.All)等待几分钟,然后我收到相同的消息。奇怪:/
  • 这很奇怪。另一种选择可能是在本地运行 Explorer(它是一个 Node 应用程序)。这可能会让您更深入地了解正在发生的事情。 github.com/microsoftgraph/microsoft-graph-explorer
  • 这成功了!版本不一样?很高兴知道问题出在哪里。
  • 嗨@MarcLaFleur 感谢您的回复。我遇到了类似的问题。我有一个后端应用程序来读写我的邮箱。您认为我可以跳过用户登录页面并将其全部作为后端吗?即使是初始获取令牌步骤?
猜你喜欢
  • 2019-07-26
  • 2016-11-04
  • 2017-06-30
  • 1970-01-01
  • 2016-08-04
  • 2017-04-30
  • 1970-01-01
  • 1970-01-01
  • 2017-03-01
相关资源
最近更新 更多