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>
问题分析及解决方案
核心问题
- 签名验证密钥缺失来源:未配置OpenID配置端点时,APIM无法自动拉取签名验证所需的公钥,必须手动提供有效密钥。
- 错误使用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
相关产品推荐
相关产品推荐

