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
相关产品推荐
相关产品推荐

