我可以导入从 Azure 外部托管的 APIM 吗?

Can I import an APIM hosted from outside Azure?

一点背景知识

我目前正在尝试设置一个 API 管理器来根据 the MSDN doc.

在混合云环境(AWS 和 Azure)中处理 Azure 中的授权

我们的环境

我们同时使用 AWS 和 Azure,并且目前我们的 API 拥有 EC2 实例。我们的 API 也很招摇,应该符合进口商要求的约定。

API 是一个 ASP.NET WebApi2(完整框架版本)并配置了 swagger。此外,当我们使用 Azure Active Directory 应用程序注册来验证我们的应用程序时,可以从 Azure 中看到 ec2 api 端点。

目前,我无法对此进行测试,因为我对 Azure 环境的权限有限并且正在等待批准,但是,我被要求探索这个。 (你一定要喜欢官僚作风)否则,我们将实施 OWIN 和 adal.js 以实现服务到服务和服务到客户端的通信,这不是首选方式。 See this MSDN article for details

提问

是否有可能或者我应该设定期望去走艰难的道路? 我可以导入从 Azure 外部托管的 APIM 吗?

当然可以。

只需导入 swagger 并添加您的 (public) 后端 URL —

要验证 API 管理和外部 API 之间的调用,我看到三种直接的方法:

  • Integrate API Management with a VNET 并通过 site-to-site VPN 调用外部 API(这减少了执行 OAuth 的需要,但需要 non-trivial 基础设施设置工作) .好吧,non-trivial 但并不可怕,看看这个 StrongSwan 配置:

    conn azure
        authby=secret
        type=tunnel
        leftsendcert=never
        left=40.127.x.x
        leftsubnet=10.5.5.0/24
        right=172.31.22.44
        rightsubnet=10.77.0.0/16
        keyexchange=ikev2
        auto=start
    
  • 使用 OAuth 2.0 客户端凭据授权。这被称为 Web App to Web API in Azure AD docs. I believe this is the relevant API Management guidance。 API 管理实例在这种情况下成为机密客户端(持有 client_id 和 client_secret),获取承载(访问)令牌并通过将其包含在中调用外部 API Authorization header.

  • 在 API 管理和您的外部 API 之间使用共享密钥。这不是世界上最安全的东西(它不会像 JWT 那样每小时都过期)但并非闻所未闻。这是处理问题的 API 密钥 方式,有点像没有 Diffie、Hellman 或 Merkle 的 Diffie-Hellman 密钥交换。只有 Alice 和 Bob 分享一个秘密:)

在任何地方都使用 HTTPS,是的,甚至跨 VPN - 考虑请求 headers/body 不变性而不是增加安全性。人们喜欢部署 "inspect" 东西的装置...