Azure AD 在 Web API 中使用来自客户端应用程序的令牌

Posted

技术标签:

【中文标题】Azure AD 在 Web API 中使用来自客户端应用程序的令牌【英文标题】:Azure AD using token from client application in Web API 【发布时间】:2020-03-28 04:17:45 【问题描述】:

我有以下设置: 2 个客户端应用程序(Xamarin Forms 和 WPF)和一个 Web API(.NET Core 2.0)。 客户端应用程序使用 MSAL 库对 Azure AD(单租户应用程序)进行身份验证。 客户端应用程序通过身份验证后,它们可以使用其身份验证令牌调用 Web API。

Web API 应该验证这个令牌(控制器中的[Authorize])如果它是有效的并且知道什么用户正在调用 API。 验证客户端没有问题,使用AcquireTokenInteractiveAcquireTokenSilent 方法非常容易。

调用 Web API 时(使用HttpClient,我们在标头中添加标记:client.DefaultRequestHeaders.Add("Bearer", token);

Startup.cs 类中的 Web API(删除了所有测试代码)配置如下(我知道这还不够):

services.AddAuthentication(AzureADDefaults.BearerAuthenticationScheme)
                .AddAzureADBearer(options => Configuration.Bind("AzureAd", options));

这是您在创建配置了 Azure AD 的新项目时获得的模板。

在 Azure AD 门户中,我们配置了应用程序,并且在客户端应用程序和 Web API 上配置了 ID(TentantId、ClientId/ApplicationId)。

我们已经对 On-Behalf-Of 流程进行了研究,但我不确定这是否是我们需要的流程。

应用程序注册为Single tentant 应用程序,如果将Suggested Redirect Uri 设置为msal[UNIQUE_ID_I_REMOVED_FOR_SECURITY]://auth,则应将其设置为https://login.microsoftonline.com/common/oauth2/nativeclient

我们没有使用 Azure AD 流程的经验,需要一些帮助。如果有人能通过链接、文档、示例代码为我指明正确的方向,将不胜感激。

感谢您的帮助。

【问题讨论】:

【参考方案1】:

This sample 展示了如何使用 V1 端点或 this one(如果使用 V2 端点)从 WPF 应用程序调用核心 API。 API 需要知道 1) 谁发布了令牌(授权),以便它可以获取其发行者名称和签名密钥 2) 其受众 ID,以便它可以验证传入令牌的受众是否适合它(通常是 guid 或 uri)。只有当您的 API 需要代表原始用户调用另一个 API 时,OBO 流程才会与您相关:该流程允许您将您收到的令牌 (API1) 交换为另一个 API (API2) 保留有关信息的令牌原始用户。

【讨论】:

谢谢。我将进一步研究这些示例并接受您的回答作为解决方案。快速查看样本应该足以解决问题。

以上是关于Azure AD 在 Web API 中使用来自客户端应用程序的令牌的主要内容,如果未能解决你的问题,请参考以下文章