You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

APIM JWT验证签名失败及公钥配置Base64无效问题求助

APIM JWT验证配置问题及解决方案

问题场景

我正在使用APIM验证JWT令牌,当前配置的策略如下:

<validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized. Access token is missing or invalid.">
        <audience>68f3930e-0492-4642-8cd0-65d68a504dba</audience>
        <audience>7a20a24d-1bc7-4906-8dfc-c0e6dfd19d69</audience>
        <audience>ae901aaf-6bea-4e1b-902c-6851e4305b1b</audience>
        <audience>0d5b8f5e-4045-459c-99f1-a710ca8dd63e</audience>
        <audience>c37587ed-2974-4932-b87f-e51886ca378e</audience>
        <audience>2f96ac72-7887-4aa4-a02c-204288fe1ed8</audience>
        <audience>7c5dd291-edd7-4dc4-ad09-25ac006a0a42</audience>
    </audiences>
    <issuers>
        <issuer>https://login.microsoftonline.com/{TenantId}/v2.0/</issuer>
        <issuer>https://{Tenant}.b2clogin.com/38cf84e1-4cbb-4abb-8aa3-4c0f7107c585/v2.0/</issuer>
        <issuer>https://sts.windows.net/{TennatId}/</issuer>
    </issuers>
</validate-jwt>

已指定issuer用于验证B2B、B2C类型JWT令牌,添加多个audience适配多应用生成的令牌,未配置OpenId Config(认为已明确指定issuer即可),但出现以下错误:

validate-jwt (-0.148 ms)
{
    "message": "JWT Validation Failed: IDX10500: Signature validation failed. No security keys were provided to validate the signature.."
}

尝试通过以下地址获取签发方密钥:

1- https://login.microsoftonline.com/{tenant_id}/discovery/keys?appid={client_id}
2- https://{Tenant}.b2clogin.com/{tenant}.onmicrosoft.com/B2C_1_si/discovery/v2.0/keys

获取多个Kid后按如下配置,保存策略时却出现“Not valid Base64 string”错误:

<issuer-signing-keys>
        <key>X5eXk4xyojNFum1kl2Ytv8dlNP4-c57dO6QGTVBwaNk</key>
        <key>Mr5-AUibfBii7Nd1jBebaxboXW0</key>
 </issuer-signing-keys> 

问题分析及解决方案

核心问题

  1. 签名验证密钥缺失来源:未配置OpenID配置端点时,APIM无法自动拉取签名验证所需的公钥,必须手动提供有效密钥。
  2. 错误使用Kid作为密钥:<issuer-signing-keys>节点要求填入Base64编码的公钥,而非从密钥端点获取的Kid(密钥ID),这是导致“Not valid Base64 string”错误的直接原因。

解决步骤

步骤1:获取正确的Base64编码公钥

从密钥端点返回的JSON数据中,找到keys数组里的x5c字段(Base64编码的证书链),取第一个值作为可直接使用的公钥。

步骤2:修正策略配置

推荐优先使用OpenID配置端点让APIM自动管理密钥(避免密钥轮换后手动更新),也可选择手动配置公钥:

方案A:配置OpenID配置端点(推荐)

添加<openid-config>节点,APIM会自动从端点获取签名密钥:

<validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized. Access token is missing or invalid.">
    <audiences>
        <audience>68f3930e-0492-4642-8cd0-65d68a504dba</audience>
        <!-- 保留其他原有audience配置 -->
    </audiences>
    <issuers>
        <issuer>https://login.microsoftonline.com/{TenantId}/v2.0/</issuer>
        <issuer>https://{Tenant}.b2clogin.com/38cf84e1-4cbb-4abb-8aa3-4c0f7107c585/v2.0/</issuer>
        <issuer>https://sts.windows.net/{TenantId}/</issuer>
    </issuers>
    <!-- 对应每个issuer添加OpenID配置端点 -->
    <openid-config url="https://login.microsoftonline.com/{TenantId}/v2.0/.well-known/openid-configuration" />
    <openid-config url="https://{Tenant}.b2clogin.com/{Tenant}.onmicrosoft.com/B2C_1_si/v2.0/.well-known/openid-configuration" />
    <openid-config url="https://sts.windows.net/{TenantId}/.well-known/openid-configuration" />
</validate-jwt>

注意:替换{TenantId}和{Tenant}为实际租户信息,B2C的OpenID配置URL需匹配对应的用户流(示例中为B2C_1_si)。

方案B:手动配置Base64公钥

若必须手动配置,将从x5c字段获取的Base64证书值填入<key>节点:

<validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized. Access token is missing or invalid.">
    <audiences>
        <!-- 保留原有audience配置 -->
    </audiences>
    <issuers>
        <!-- 保留原有issuer配置 -->
    </issuers>
    <issuer-signing-keys>
        <!-- 替换为从x5c获取的Base64编码公钥 -->
        <key>MIIDBTCCAe2gAwIBAgIQ...</key>
        <key>MIIEvQIBADANBgkqhkiG9w0BAQE...</key>
    </issuer-signing-keys>
</validate-jwt>

步骤3:验证配置

保存策略后,使用对应类型的JWT令牌测试APIM接口,确认签名验证通过。

内容的提问来源于stack exchange,提问作者Arslan Pervaiz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 20:14:53