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 中使用来自客户端应用程序的令牌的主要内容,如果未能解决你的问题,请参考以下文章

使用 Azure Ad Auth 从 .NET Core Web API 读取/写入 Azure Blob

使用用户模拟来调用Azure AD Microsoft API的Web API

使用 azure AD B2C 进行 blazor web api 身份验证

来自不同租户的 Azure AD 同意

无法验证从 Azure AD 获得的访问令牌签名以保护 Web API

Azure AD 身份验证令牌未通过 Web api 授权