【问题标题】:Validate multiple issuers in Azure APIM policy在 Azure APIM 策略中验证多个颁发者
【发布时间】:2020-12-21 07:28:13
【问题描述】:

我工作的公司多年来收购了多种产品。
我们一直在开发一个共享的微服务生态系统。
产品(当前)向不同的 IDP(例如 Auth0、Azure B2C)进行身份验证。 后端微服务可以很好地处理多个颁发者,但我们还希望在 API 网关 - Azure APIM 上进行身份验证检查,如果 JWT 访问令牌无效,则进行短路。

如何在 Azure APIM 中验证多个颁发者?

docs 中,我可以看到我可以指定多个颁发者,但只有 1 个 openid-config。如果只有 1 个 openid-config,它将如何获得多个发行者的公共签名密钥?大概它是为了获取 JWKS 端点,然后是验证令牌签名的信息......

这是我正在谈论的 APIM(入站)政策的一部分:

<validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized" require-expiration-time="true" require-signed-tokens="true">
    <openid-config url="https://example-company.au.auth0.com/.well-known/openid-configuration" />
    <audiences>
        <audience>test</audience>
        <audience>blah</audience>
    </audiences>
    <issuers>
        <issuer>https://example-company.au.auth0.com</issuer>
        <issuer>http://contoso.com/</issuer>
    </issuers>
</validate-jwt>

【问题讨论】:

    标签: azure azure-api-management


    【解决方案1】:

    APIM 会读取完整的 OpenID 连接配置并链接 JWKS 以获取密钥列表和有效发行者。同时,您拥有的样本也应该可以正常工作,来自 OIDC 和明确指定的发行者将被合并。

    【讨论】:

    • 感谢您的回复。也许我在这里遗漏了一些东西,但它如何验证我提供的列表中第二个颁发者的令牌 - 'contoso.com' ?没有对应的 OIDC 配置 url(从中获取公共签名密钥)...
    • 验证发行者和验证令牌签名是两个不同的东西。通过上述策略的配置,将让具有颁发者“contoso.com”的令牌被视为具有有效的颁发者,但仍需要检查签名。以上只会提供来自 OIDC 配置的策略密钥来验证这一点。如果您需要添加更多密钥,您可以这样做。
    • 嗯...我可以添加更多 openid-config 吗?我不认为我可以。我不想在 APIM 策略中显式添加密钥信息,因为 IDP 可以随时滚动到新密钥(并破坏我的身份验证)。我知道 IDP 可能不会经常进行密钥翻转,但如果他们这样做了,我不想去 APIM 中进行更改以支持这一点......
    【解决方案2】:

    只是为了澄清;我工作的公司有多种产品,每种产品都有单独的 IDP 和/或租户 - 基本上,产品之间的用途没有交叉。

    validate-jwt 策略只允许 1 个openid-config 元素,但对于我的场景,我有多个 OpenId 配置...

    我通过以下方式设法解决了这个问题:

    <choose>
        <when condition="@(context.Request.Headers.GetValueOrDefault("X-ProductCode","") == "XYZ")">
            <validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized" require-expiration-time="true" require-signed-tokens="true">
                <openid-config url="https://xyz.au.auth0.com/.well-known/openid-configuration" />
                <audiences>
                    <audience>xyz-audience1</audience>
                </audiences>
            </validate-jwt>
        </when>
        <when condition="@(context.Request.Headers.GetValueOrDefault("X-ProductCode","") == "ABC")">
            <validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized" require-expiration-time="true" require-signed-tokens="true">
                <openid-config url="https://abc.au.auth0.com/.well-known/openid-configuration" />
                <audiences>
                    <audience>abc-audience1</audience>
                    <audience>abc-audience2</audience>
                </audiences>
            </validate-jwt>
        </when>
    </choose>
    

    【讨论】:

      猜你喜欢
      • 2020-10-29
      • 1970-01-01
      • 1970-01-01
      • 2022-01-02
      • 2020-05-17
      • 2023-01-12
      • 2023-03-18
      • 2017-08-28
      • 2018-12-18
      相关资源
      最近更新 更多