【问题标题】:Azure Api Management: verify that JWT and Ocp-Apim-Subscription-Key belong to the same user?Azure Api 管理:验证 JWT 和 Ocp-Apim-Subscription-Key 是否属于同一个用户?
【发布时间】:2025-12-21 08:45:10
【问题描述】:

我的 api 受到两种方式的保护:JWT 验证和Ocp-Apim-Subscription-Key 要求。

Azure AADB2C JWT 断言用户就是他所说的那个人,同时保证他最近证明了这样的身份(用户+密码)。

Ocp-Apim-Subscription-Key证明A用户订阅了引用的api/product。

问题是:我如何断言所提供的Ocp-Apim-Subscription-Key 属于 JWT 通知的用户?如果“黑客”能够窃取合作伙伴 A 的凭据并窃取合作伙伴 B 的 Ocp-Apim-Subscription-Key 怎么办?

编辑 1 - 这是我所做的:

  1. 创建了 2 个帐户 A 和 B
  2. 创建了一个需要 OCP 密钥并验证 JWT 的 api
  3. 为该 API 创建了产品 P
  4. 订阅 A 到 P
  5. 使用 B 的凭据获得了 JWT
  6. B “偷”了 A 的订阅密钥
  7. B 使用自己的 JWT 和 A 的订阅密钥成功消费了产品 P

【问题讨论】:

标签: azure azure-api-management


【解决方案1】:

当为用户使用订阅密钥时,context.User 会被填充,其中包含电子邮件地址等详细信息,您可以使用它来验证 JWT 令牌中存在的类似声明。如果它们匹配或不匹配,您将使用choose policy 采取相应的行动。您可以使用选择策略中的return-response policy 来缩短请求。

【讨论】:

    【解决方案2】:

    我认为您正在混淆这些想法。客户端 A 和客户端 B 不应共享相同的 Ocp-Apim-订阅密钥。第一个验证应该是检查提供的用户名和密码是否正确。 (认证部分)。

    假设正确,则需要检查授权部分。如果他们为分配给他们的产品提供正确的 Ocp-Apim-Subscription-Key 值。

    例如

    username | password | Product Subscription | Product Key
    abc      | 123      | A                    | 62140881-0e72-4d99-b26c-802423a815f5
    def      | 444      | B                    | 5f175bb2-f4ec-4302-ac27-56dab358b04b
    

    假设用户 def 正在尝试使用 62140881-0e72-4d99-b26c-802423a815f5 作为产品密钥,即使它是有效的,他们也应该收到 403 错误。

    【讨论】:

    • 请检查我的编辑。 A 和 B 不“共享”任何类型的凭据,而是以任何方式从另一个人那里窃取信息。
    • 我认为手头有 Ocp-Sub-Key 只能证明某人在未知的时间点订阅了该 API/产品
    • 正确。但是,除非您以某种方式知道 IP 范围并进行某种指纹识别,否则您无能为力。例如,如果您以某种方式使用我的用户名和密码并尝试登录 Facebook,它会检测到它是未知设备。但如果我们都使用 iphone 并且住在附近,我相信它会起作用。对于您的应用程序也是如此,除非您以某种方式关联 A 用户,如果来自 B 的某人使用来自 A + B 订阅的有效凭据,它也将起作用。但是,当发生这种情况时,您可以尝试标记/警告,A 用户使用 B 凭据登录。
    • 但问题是门户网站上的订阅将/应该分配给在访问令牌上经过身份验证的同一用户...这看起来像一个安全漏洞
    • 我需要做一个测试,但我相信这个场景应该被 APIM 覆盖。在最后一种情况下,您可以验证用户是否订阅了该产品。 (docs.microsoft.com/en-us/rest/api/apimanagement/…)