【问题标题】:How to consume Graph API with a ADAL token?如何使用 ADAL 令牌使用 Graph API?
【发布时间】:2018-04-14 04:44:42
【问题描述】:

在我的 Xamarin.forms 项目中,我使用 ADAL (Microsoft.IdentityModel.Clients.ActiveDirectory) 在 Azure 门户(Auth 1.0 端点)上进行身份验证。那部分工作得很好,但我需要获取用户的安全组。所以我使用这段代码并传递使用 ADAL 接收的令牌:

 HttpClient client = new HttpClient();
 HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Get, "https://graph.microsoft.com/v1.0/me/memberOf");
 message.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("bearer", token);
 HttpResponseMessage response = await client.SendAsync(message);
 string responseString = await response.Content.ReadAsStringAsync();

我总是得到 StatusCode: 401, ReasonPhrase: 'Unauthorized'。 在我的 azure AD 应用注册中,我添加了 Graph API 和这些权限:

我想我错过了什么。有什么想法吗?

----- 编辑 1 --- 这是我的有效载荷。为了方便起见,我将其更改为图片。我不知道如何在这里发布json

----- 编辑 2 --- 哦!我知道了。我想我需要更多地了解 Azure 登录过程。现在,我遵循 ADAL 和 Azure 的示例,让我在后端记录并使用某些功能。所以登录过程使用:

var authContext = new AuthenticationContext(authority); var authResult = await authContext.AcquireTokenAsync(resource, clientId, uri, platformParams);

其中 authority = https://login.microsoftonline.com/mysite.com,ResourceID 是我的后端应用 ID,clientID 是我的原生应用 ID。所以肖恩是正确的,我不使用 Graph.microsoft.com 来获取令牌。我们有其他方法来实现这一切吗?使用Graph只需要获取用户在应用内调整权限的AD组。

【问题讨论】:

  • 我想我找到了原因。我用于测试的用户已经接受了同意。现在我添加了新的图表权限,我需要强制它重新接受新的同意,但我可以找到一种方法来强制它。我尝试使用 platformParams.PromptBehavior = PromptBehavior.Auto;没有成功。
  • 皮埃尔,你在更新中问什么?只需更新您的代码以向 Graph 请求令牌,而不是您为 resource 设置的任何内容。您可能想提出一个新问题,因为您提出的问题与以前完全不同。
  • Shawn,我不知道我可以连续调用 2 次 AcquireTokenAsync。一次使用我的后端 ID 并获取一个以 93f 开头的 aud 令牌,然后使用 Graph URL 进行第二次调用以获取对图形有效的第二个令牌。现在一切正常。感谢您的帮助。

标签: azure xamarin.forms azure-active-directory


【解决方案1】:

您的评论是正确的。如果您向应用程序添加新权限,则必须要求用户重新同意该应用程序。

您可以通过将 PromptBehavior 设置为 Always 来强制通过 ADAL 重新同意:

platformParams.PromptBehavior = PromptBehavior.Always

或者您可以通过添加查询字符串来简单地修改您的登录 URL 以强制它:

&prompt=consent

在构建应用程序来帮助解决这个问题方面,如果您认为您的应用程序在发布后会更改权限,您可以集成检测Unauthorized 的逻辑,然后发送用户重新同意。

另一个选项是让您的应用跟踪可能需要新的同意提示的更改,并检测用户何时首次使用您的应用程序的这个新版本,并请求他们同意。

在我们新的 App Model V2 中,我们支持 Incremental and Dynamic Consent 的概念,它应该会为您解决这个问题。

【讨论】:

  • 感谢您的回复。我尝试使用 PromptBehavior.Always 但没有任何改变。登录视图不要求更多同意。所以我决定删除 Azure 门户中的原生应用程序,然后重新创建它。现在我获得了“新”同意,但当我要求 graph.microsoft.com/v1.0/me/memberOf 时,我总是未经授权。你认为我需要更多的许可吗?
  • 你可以use documentation回答这个问题。
  • 是的,我已经读过了。他说对于 MemberOf 我只需要 Graph->Read all groups。我将该权限设置为我的本机应用程序,然后执行并接受新的同意,但我总是得到我得到的 HttpResponseMessage:“StatusCode:401,ReasonPhrase:'未授权',版本:1.1,内容:System.Net.Http。 StreamContent, Headers”,但在 response.Content.ReadAsStringAsync() 中我得到:“code”:“InvalidAuthenticationToken”,“message”:“Access token 验证失败。”。在 AcquireTokenAsync 不适合 Graph 之后,您是否会在 AuthenticationResult 中精简我的令牌接收?
  • 您可以使用解码器like this 分享您的访问令牌的内容吗?确保删除所有敏感数据。
  • 根据这篇文章:stackoverflow.com/questions/43230389/… 我们不能使用 ADAL 令牌来查询 Microsoft Graph。他们打算使用graph.windows.net。但我认为微软不建议这样做......
猜你喜欢
  • 2018-02-05
  • 1970-01-01
  • 2017-07-01
  • 2019-05-15
  • 2019-07-16
  • 2016-05-03
  • 2017-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多