在 Azure APIM 策略中验证多个颁发者
Validate multiple issuers in Azure APIM policy
我工作的公司多年来收购了多种产品。
我们一直在开发一个共享的微服务生态系统。
这些产品(当前)向不同的 IDP(例如 Auth0、Azure B2C)进行身份验证。
后端微服务可以很好地处理多个发行者,但我们还想在 API 网关 - Azure APIM 进行 authN 检查,如果 JWT 访问令牌无效则短路。
如何在 Azure APIM 中验证多个颁发者?
在docs中,我可以看到我可以指定多个发行者,但只有1个openid-config。如果只有 1 个 openid-config,如何为多个发行者获取 public 签名密钥?据推测,这是为了获取 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>
APIM 会读取完整的 OpenID 连接配置和链接的 JWKS 以获取密钥和有效颁发者的列表。同时,您拥有的示例也应该可以正常工作,来自 OIDC 的发行人和明确指定的发行人将合并。
澄清一下;我工作的公司有多种产品,每种产品都有一个单独的 IDP and/or 租户 - 基本上产品之间没有交叉使用。
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>
我工作的公司多年来收购了多种产品。
我们一直在开发一个共享的微服务生态系统。
这些产品(当前)向不同的 IDP(例如 Auth0、Azure B2C)进行身份验证。
后端微服务可以很好地处理多个发行者,但我们还想在 API 网关 - Azure APIM 进行 authN 检查,如果 JWT 访问令牌无效则短路。
如何在 Azure APIM 中验证多个颁发者?
在docs中,我可以看到我可以指定多个发行者,但只有1个openid-config。如果只有 1 个 openid-config,如何为多个发行者获取 public 签名密钥?据推测,这是为了获取 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>
APIM 会读取完整的 OpenID 连接配置和链接的 JWKS 以获取密钥和有效颁发者的列表。同时,您拥有的示例也应该可以正常工作,来自 OIDC 的发行人和明确指定的发行人将合并。
澄清一下;我工作的公司有多种产品,每种产品都有一个单独的 IDP and/or 租户 - 基本上产品之间没有交叉使用。
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>