【问题标题】:Azure API Management and Backend Web APIAzure API 管理和后端 Web API
【发布时间】:2021-11-12 09:09:58
【问题描述】:

我在 Azure 应用服务中部署了一个 Web API。 Web API 使用 Azure AD 进行保护。我打算使用 API 管理将 api 公开给各种用户。

现在,我已在 API 管理中启用对开发人员门户的基本身份验证。另外,我为后端服务器启用了 OAuth 2.0 身份验证(用户授权)。所以,如果我登录到开发者门户,我可以看到两个字段——订阅密钥和授权。订阅密钥将是开发人员对门户的订阅,授权将是后端服务器所需的 OAuth 授权。

另外,如果需要任何用户访问api管理url,用户需要在查询字符串中传递订阅密钥和授权头中的令牌(例如:桌面客户端)。

有没有办法通过只使用 JWT 令牌而不使用订阅密钥来调用 api 管理 URL(但我仍然需要知道哪个开发人员/用户访问了该服务)。我期待的是单个令牌,可用于向开发人员门户验证用户身份,并可用于对后端 api 进行身份验证(通过转换为后端服务器令牌或通过任何其他方式)

谢谢,

约翰

【问题讨论】:

  • 嘿@John,你找到解决办法了吗?
  • 不。我们最终使用了两个标头 - 订阅密钥和 oauth 令牌

标签: azure asp.net-web-api oauth-2.0 azure-active-directory azure-api-management


【解决方案1】:

是的,你可以做到(有点小技巧)。为此,您必须使用 REST Api,特别是 call。对我来说,编辑现有 API 不起作用(它们的密钥仍然存在),但是当我创建新 API 时,密钥不存在:

我不得不把我所有的东西都弄模糊了,很抱歉。因此,要实现这一点,您需要发出以下查询:

路径

PUT https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ApiManagement/service/{serviceName}/apis/{apiId}?api-version=2016-07-07&import=true&path={APIpostfix}

标题

Authorization = "Bearer TOKEN_GOES_HERE" ## Space after 'Bearer' is mandatory  
Content-Type = "application/vnd.swagger.link+json" ## Look for the proper "Content-Type" on the page I've linked. This is the example to import API definition directly from "swagger.json" generated by your running api.

主体:

{
    "name": "Name",
    "description": "Desc",
    "link": "http://url.to/your/swagger.json", ## <<only needed if you import directly from running API
    "serviceUrl": "https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ApiManagement/service/{serviceName}/apis/{apiId}/backends/{APIpostfix}", ## << declare your API Management backend
    "protocols": [
        "https"
    ],
    "authenticationSettings": {
        "oAuth2": null,
        "openid": null
    },
    "subscriptionKeyParameterNames": { ## << Magic happens here
        "header": null,
        "query": null
    }
}

PS。我从来没有费心去弄清楚 PUT + Send 通过 swagger 文件,但是当您知道这一点时,我相信它非常简单。

【讨论】:

  • 我没有清楚地理解你让我做什么。但是,这样做我将如何识别哪个用户调用了 api 管理服务?
  • 我需要摆脱订阅键.. 但我仍然需要知道用户统计信息(即哪些用户正在调用哪些应用程序)。正如我在最初的帖子中提到的那样-“我期待的是单个令牌,可用于向开发人员门户验证用户身份,并可用于向后端 api 进行身份验证(通过翻译到后端服务器)令牌或任何其他方式)”
  • 所以使用 JWT,有什么问题?
  • 但是 JWT 会通过后端 api 对用户进行身份验证。但是我如何知道哪个用户在没有订阅密钥的情况下使用 API 管理服务 url?我问的原因是我不希望用户使用两个身份验证密钥 - 订阅密钥和 JWT 令牌来访问 api 管理 url。我能想出一种方法来只使用 JWT 来调用 api 管理服务吗?我仍然需要从 api 管理中了解用户统计信息(如事件中心日志等)
  • 答案是肯定的,你可以这样做,但这是完全不同的问题
【解决方案2】:

APIM 中的订阅密钥与用户和产品相关联,因此如果您更改(或创建新的)产品以不需要订阅(在创建时或产品设置中可用的选项),则不需要订阅密钥来调用任何此类产品中包含 API。

缺点是所有此类调用都将被 APIM 视为匿名并显示在分析中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    相关资源
    最近更新 更多