如何在APIM中验证Authorization头传递的HMAC-SHA256令牌?
Azure API Management 配置HMAC-SHA256令牌验证
你当前使用的validate-jwt策略仅适用于OpenID标准的JWT令牌验证,要验证基于Client ID和Client Secret生成的HMAC-SHA256令牌,需要替换为validate-signature策略,并结合变量提取逻辑完成验证,具体配置如下:
完整Policy配置示例
<policies> <inbound> <base /> <!-- 提取Authorization头中的令牌(假设格式为Bearer <token>,按需调整前缀) --> <set-variable name="rawToken" value="@(context.Request.Headers.GetValueOrDefault("Authorization", "").Replace("Bearer ", ""))" /> <!-- 执行HMAC-SHA256签名验证 --> <validate-signature algorithm="HMAC-SHA256" rule="all"> <!-- 使用APIM命名值存储的Client Secret(避免硬编码) --> <key>{{ClientSecret}}</key> <!-- 与令牌生成端一致的签名原始内容:如果令牌是对特定请求内容签名,替换为对应内容(如请求路径+时间戳) --> <content>@(context.Variables.GetValueOrDefault<string>("rawToken"))</content> <!-- 从请求中提取的待验证令牌 --> <signature>@(context.Variables.GetValueOrDefault<string>("rawToken"))</signature> <failed-validation-httpcode>401</failed-validation-httpcode> <failed-validation-error-message>Authorization Failed. Invalid HMAC-SHA256 Token</failed-validation-error-message> </validate-signature> </inbound> <backend> <base /> </backend> <outbound> <base /> </outbound> <on-error> <base /> </on-error> </policies>
关键配置说明
- 令牌提取:通过
set-variable从Authorization头中剥离前缀(如Bearer),得到原始令牌值。 - 签名验证核心:
algorithm指定为HMAC-SHA256,与令牌生成算法匹配;key引用APIM的命名值(Named Values)存储的Client Secret,禁止硬编码敏感信息;content和signature需与令牌生成逻辑对齐:- 如果令牌是直接对某个字符串用Client Secret签名的结果,两者设为同一令牌值;
- 如果令牌是对请求元数据(如URL、时间戳、Body)签名的结果,
content需设置为生成令牌时的原始签名内容。
- 错误处理:验证失败时返回401状态码和自定义提示信息。
注意事项
- 必须确保验证端的签名算法、密钥、签名内容与令牌生成端完全一致,否则验证会失败;
- 若令牌包含过期时间等额外校验逻辑,可添加
set-variable结合choose策略补充验证; - Client Secret需通过APIM门户的「命名值」功能配置,配置后用
{{ClientSecret}}引用,保障敏感信息安全。
内容的提问来源于stack exchange,提问作者Sindhu1990
相关产品推荐
相关产品推荐

