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

Azure API Management策略从JWT获取含Unicode字符声明失败如何解决

问题原因

Azure APIM 内置的AsJwt()方法在解析JWT声明时,默认使用ASCII编码解码Payload内容,遇到包含变音符号、非英文等Unicode字符时就会出现解析失败、返回空值或者乱码的问题,这是该内置方法的已知编码缺陷。

解决方案

弃用内置AsJwt()方法,手动拆分JWT结构、使用UTF-8编码解码Payload后提取声明,具体实现代码如下:

var authHeader = context.Request.Headers.GetValueOrDefault("Authorization", string.Empty);
// 仅处理Bearer类型的Authorization头
if (authHeader.StartsWith("Bearer ", StringComparison.OrdinalIgnoreCase))
{
    var token = authHeader["Bearer ".Length..].Trim();
    var jwtParts = token.Split('.');
    // 校验JWT结构是否符合标准
    if (jwtParts.Length == 3)
    {
        // 处理Base64Url编码的兼容转换
        var payloadRaw = jwtParts[1]
            .Replace('-', '+')
            .Replace('_', '/');
        // 补全Base64填充字符
        payloadRaw += payloadRaw.Length % 4 switch
        {
            2 => "==",
            3 => "=",
            _ => string.Empty
        };
        // 用UTF-8编码解码Payload
        var payloadBytes = Convert.FromBase64String(payloadRaw);
        var payloadJson = Encoding.UTF8.GetString(payloadBytes);
        // 解析JSON提取name声明
        var jwtPayload = JObject.Parse(payloadJson);
        return jwtPayload.Value<string>("name") ?? "unknown";
    }
}
return "unknown";
注意事项
  • 该实现完全兼容所有Unicode字符场景,同时保留了原逻辑的空值兜底返回unknown的行为
  • Azure APIM策略表达式默认支持JObject类型的JSON解析操作,无需额外引入依赖
  • 代码中已经兼容了JWT标准的Base64Url编码格式,不会出现解码错误的问题
  • 手动解析逻辑性能开销极低,和内置方法几乎没有差异,可正常在生产环境使用

内容的提问来源于stack exchange,提问作者Manas Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 16:24:04