Azure AD 将多个应用程序连接到单个 Web API

Posted

技术标签:

【中文标题】Azure AD 将多个应用程序连接到单个 Web API【英文标题】:Azure AD connect multiple apps to single Web API 【发布时间】:2020-01-01 15:06:56 【问题描述】:

我有一个使用 asp.net 核心编写的 Web API。此 API 将用于与在 AAD 中注册的其他几个服务进行通信,所有这些都可以使用不同的技术来实现,例如用 asp.net 核心编写的 MVC 应用程序或用 Vue.JS 编写的单页应用程序。后者给我带来了问题,因为 SPA 不会由应用程序 Web 服务器运行,而是由 nginx 或 apache 之类的东西运行,因此无法使用客户端密码。

我已将我的 API 的 API 权限添加到我的应用中。

我将如何实现这一目标?我目前正在使用Authorization: Bearer access_token 标头从客户端应用程序向 API 发送访问令牌,但由于客户端应用程序和 API 在 AAD 中不是同一个应用程序,因此会导致问题。

这是我想要实现的流程:

所有请求的应用程序都要求您登录 AAD,当从 API 请求数据时,它们会发送 JWT 令牌,然后在将请求的资源返回给客户端应用程序之前验证令牌。

【问题讨论】:

如果想了解如何访问Azure AD投射的web api,请参考示例(github.com/Azure-Samples/…)。 @test123 这不是这里的问题,我已经可以做到了。问题来自将多个应用程序连接到单个 Web API,如果只有所有应用程序都是 asp.net MVC 应用程序,或者如果所有应用程序都有一个连接到它们的 Web 服务器,这将不是问题,但我有一个 SPA,它是静态文件。 你想知道SAP如何访问API? @test123 是的,不过我知道该怎么做。当我希望 SPA 连接到 API 而注册为不同 AAD 应用程序的其他应用程序(如其他 SPA)尝试连接到同一 API 时,就会出现问题。 关于SPA,可以使用oauth2隐式授权流来访问web api。更多详情请参考docs.microsoft.com/en-us/azure/active-directory/develop/… 【参考方案1】:

你好像误会了什么。您可以在 Azure AD 中将您的每个客户端注册为独立的应用程序,并为您的 Web api 分配访问权限。

后者给我带来了问题,因为 SPA 不会由应用程序 Web 服务器运行,而是由 nginx 或 apache 之类的服务器运行,因此无法使用客户端密码。

SPA 应用程序使用Implicit grant flow,因此它在获取令牌时不需要客户端密码。SPA 可以是独立的应用程序,您应该在使用 AAD 进行身份验证时提供客户端 ID。获取访问令牌后,您可以使用 Authorization: Bearer access_tokenheader 创建 http 请求以访问您的 web api。

每个客户端(web/spa/native)都将获取访问令牌以访问 web api。在 web api 端,您只需要验证令牌。验证声明(颁发者、受众)和签名。

【讨论】:

你是对的,使用github.com/Azure-Samples/ms-identity-aspnet-webapi-onbehalfof 中的示例我设法让一切工作完美。谢谢。

以上是关于Azure AD 将多个应用程序连接到单个 Web API的主要内容,如果未能解决你的问题,请参考以下文章

将未加入域的 PC 连接到 Azure 中的单个服务器

如何通过JMeter将多个MQTT客户端连接到单个iothub

连接到 Azure AD 时,UWP 中的 OIDCClient“指定的协议未知”异常

我们如何使用 Azure AD 使用 DB Visualizer 连接到雪花

将 Azure AD B2C 用户连接到我的数据库帐户的正确 Core 3.0 API 中间件?

C# MVC Web 应用服务连接到 Azure 存储 Blob