Azure APIM同一API多身份提供商配置:验证Entra令牌客户端ID
Azure APIM中混合验证Microsoft Account与Entra令牌的实现方案
常规实现方式:通过Choose分支区分验证逻辑
你提到的方案是可行的,具体落地步骤如下:
- 先用
validate-jwt策略解析令牌,提取颁发者(iss字段)信息,这里仅完成基础解码,无需做全量严格验证。 - 用
<choose>块根据颁发者分支处理:- 如果令牌来自你的Entra租户(
iss匹配https://login.microsoftonline.com/{你的租户ID}/v2.0),执行validate-azure-ad-token策略,通过client-ids属性指定允许的客户端应用ID列表,完成Entra令牌的完整验证。 - 如果令牌来自Microsoft Account公共租户(
iss为https://login.microsoftonline.com/9188040d-6c67-4c5b-b112-36a304b66dad/v2.0),使用validate-jwt策略验证MSA令牌的合法性(按需配置受众、签名密钥等规则)。
- 如果令牌来自你的Entra租户(
示例策略片段:
<validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Invalid token" output-token-variable-name="parsedToken"> <issuers> <issuer>https://login.microsoftonline.com/9188040d-6c67-4c5b-b112-36a304b66dad/v2.0</issuer> <issuer>https://login.microsoftonline.com/your-tenant-id/v2.0</issuer> </issuers> <!-- 仅做令牌解码,后续分支执行严格验证 --> </validate-jwt> <choose> <when condition="@(context.Variables.GetValueOrDefault<Jwt>("parsedToken").Issuer == "https://login.microsoftonline.com/your-tenant-id/v2.0")"> <validate-azure-ad-token header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Invalid Entra token"> <client-ids> <client-id>allowed-client-id-1</client-id> <client-id>allowed-client-id-2</client-id> </client-ids> <tenant-id>your-tenant-id</tenant-id> </validate-azure-ad-token> </when> <otherwise> <!-- MSA令牌的严格验证逻辑 --> <validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Invalid MSA token"> <issuers> <issuer>https://login.microsoftonline.com/9188040d-6c67-4c5b-b112-36a304b66dad/v2.0</issuer> </issuers> <audiences> <audience>your-api-client-id</audience> </audiences> <openid-config url="https://login.microsoftonline.com/9188040d-6c67-4c5b-b112-36a304b66dad/v2.0/.well-known/openid-configuration" /> </validate-jwt> </otherwise> </choose>
更简洁的替代方案:单一Validate-JWT策略实现混合验证
不需要拆分策略,直接用validate-jwt的多颁发者配置+条件化必填声明就能完成需求,步骤如下:
- 在
validate-jwt中配置包含MSA和Entra的颁发者列表。 - 针对Entra令牌需要验证的客户端ID(
azp字段),通过<when>条件指定只有当令牌来自Entra租户时才触发该声明验证。
示例策略片段:
<validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Invalid token"> <issuers> <issuer>https://login.microsoftonline.com/9188040d-6c67-4c5b-b112-36a304b66dad/v2.0</issuer> <!-- MSA租户 --> <issuer>https://login.microsoftonline.com/your-tenant-id/v2.0</issuer> <!-- Entra租户 --> </issuers> <audiences> <audience>your-api-audience</audience> </audiences> <required-claims> <!-- 仅当令牌来自Entra租户时,验证azp字段是否在允许列表 --> <claim name="azp"> <value>allowed-entra-client-id-1</value> <value>allowed-entra-client-id-2</value> <when>@(token.Issuer == "https://login.microsoftonline.com/your-tenant-id/v2.0")</when> </claim> </required-claims> <openid-config url="https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration" /> </validate-jwt>
这种方式无需分支逻辑,用单一策略就能完成两种令牌的验证,同时针对Entra令牌强制执行客户端ID校验,MSA令牌则跳过该验证(仅需满足通用的颁发者、受众等规则)。
总结
不是必须使用validate-jwt+choose+validate-azure-ad-token的组合,单一validate-jwt策略通过多颁发者配置和条件化必填声明,就能更简洁地实现混合令牌验证需求。
内容的提问来源于stack exchange,提问作者user9297554
相关产品推荐
相关产品推荐

