【发布时间】:2018-07-12 03:37:50
【问题描述】:
我正在开发一个使用 Azure AD 进行身份验证的 Angular2+ 应用程序。我需要将令牌传递给我的 Web API 层(使用 HttpInterceptor 成功运行),然后在服务器端使用该令牌调用 Microsoft Graph。
如何将一个令牌转换为另一个令牌,最好是在服务器上?
【问题讨论】:
标签: azure-active-directory microsoft-graph-api adal
我正在开发一个使用 Azure AD 进行身份验证的 Angular2+ 应用程序。我需要将令牌传递给我的 Web API 层(使用 HttpInterceptor 成功运行),然后在服务器端使用该令牌调用 Microsoft Graph。
如何将一个令牌转换为另一个令牌,最好是在服务器上?
【问题讨论】:
标签: azure-active-directory microsoft-graph-api adal
正是代表流程的场景。
这是我在上面写的博客文章:https://joonasw.net/view/azure-ad-on-behalf-of-aspnet-core。
这是一个相当长的句子,所以让我们看一个使用它的示例场景:
- JavaScript 单页应用程序使用 Azure AD 对用户进行身份验证
- SPA 为其后端 API 获取访问令牌并调用 API
- API 然后需要从 Microsoft Graph API 获取有关用户经理的信息
在这种情况下,基本上有两种选择:
- 使用代表授权获取允许 API 以用户身份调用 MS Graph 的访问令牌
- 使用客户端凭据授权作为 API 进行调用,无需用户上下文
第一个选项使用委托权限,这意味着可以返回的数据基于 API 和用户被允许访问的内容。它确实要求对该 API 的调用是使用用户上下文进行的。
第二个选项将改为使用应用程序权限,在这种情况下,应用程序本身需要有权访问组织中任何用户的此信息。
您大概可以理解为什么通常首选使用委派权限。它遵循最小特权原则。
您可以在https://github.com/juunas11/azure-ad-on-behalf-of-sample-aspnetcore 找到本文中使用的示例应用程序。
因此,您基本上可以交换从 SPA 获得的令牌以及 API 的凭据,以获取另一个 API 的新访问令牌。这个新令牌也将在用户上下文中,并将使用委派权限。
这是一个进行令牌交换的 HTTP 请求示例:
POST https://login.microsoftonline.com/joonasapps.onmicrosoft.com/oauth2/token HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: login.microsoftonline.com
Content-Length: 1650
Expect: 100-continue
Connection: Keep-Alive
grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&client_id=f3c39179-62f7-45fc-a469-a64fdfce4f91&client_secret=REDACTED&resource=https%3A%2F%2Fgraph.microsoft.com&assertion=eyJ0eLongAccessTokenForThisApi&requested_token_use=on_behalf_of
您可以在这里找到更多信息:https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-protocols-oauth-on-behalf-of
【讨论】: