通过 Azure API 管理生成访问令牌并针对 IdentityServer4 进行验证

Posted

技术标签:

【中文标题】通过 Azure API 管理生成访问令牌并针对 IdentityServer4 进行验证【英文标题】:Generate Access Token and validate against IdentityServer4 through Azure API Management 【发布时间】:2019-01-09 11:48:58 【问题描述】:

我有一个外部端点,它将访问 Azure API 网关,并将其路由到受 IdentityServer4 授权保护的后端 API。

如果我使用来自 IdentityServer 的交互式 UI 通过 Postman 客户端点击它,我将获得访问令牌。

有没有一种方法可以从 Azure API 管理获取所需的访问令牌,以针对 IdentityServer4 进行验证并将其附加到后端 API 请求中的标头?

【问题讨论】:

【参考方案1】:

是的,可以通过自定义策略来实现。您可以要求您的外部 API-Client/Consumer 在 heaser 中输入凭证,然后在入站中编写一个策略,以读取这些用户凭证并执行 API 请求(类似于您的邮递员)并获取访问令牌。然后,您可以附加相同的令牌,让您的请求被转发到后端 API。

根据您的问题陈述,这应该有效。如果没有,您可能需要通过更多描述/步骤来解释您的场景。

以下是一些参考资料,希望对你有所帮助。

https://docs.microsoft.com/en-us/azure/api-management/api-management-advanced-policies#SendRequest

https://docs.microsoft.com/en-us/azure/api-management/api-management-sample-send-request

【讨论】:

【参考方案2】:

Postman 可以让人类用户看到 UI 并授权 API 访问和 IdentityServer4 为 Postman 颁发令牌。 APIM 服务器处理调用时没有这种奢侈,因为您可以向 IdentityServer4 发送令牌请求,但会向谁提供 UI 以授权该操作?

唯一的方法是为 APIM 提供某种机密(标头、查询、证书),IdentityServer4 可以识别这些机密,以允许它为 APIM 颁发令牌。如果这样的 secred 可用,您可以使用 send-request 策略调用 IdentityServer4 并获取所需的令牌。

或者确保对 APIM 的每个请求都已经有一个令牌。

【讨论】:

最后一行对我来说最有意义。消费应用程序(客户端)不应该首先进行身份验证并需要访问令牌来调用 APIM 公开的端点吗?然后 APIM 应该验证令牌并调用后端 api 这确实是最常见的情况。尽管其他可能包括需要将身份验证分离到 APIM 和后端。在这种情况下,需要通过来自用户的令牌以外的方式来验证 APIM。

以上是关于通过 Azure API 管理生成访问令牌并针对 IdentityServer4 进行验证的主要内容,如果未能解决你的问题,请参考以下文章

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

从 Postman 生成 Azure 访问令牌

我们可以在不使用 SAS 令牌的情况下通过 c# 代码调用 Azure API 管理吗

Azure API 管理 - 如何刷新访问令牌后端 API?

Azure API 管理:使用 Oauth2 401 的授权给出“未经授权。访问令牌丢失或无效。”

Azure AD Msal 拦截器访问令牌