首页 > 解决方案 > 在 Azure APIM 策略中验证多个颁发者

问题描述

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

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

文档中,我可以看到我可以指定多个颁发者,但只有 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>

标签: azureazure-api-management

解决方案


只是为了澄清; 我工作的公司有多种产品,每种产品都有一个单独的 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>

推荐阅读