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

Azure工作流C#脚本本地与远程HMAC匹配问题解决

解决Azure工作流中HMAC验证因JSON格式不一致导致的不匹配问题

核心问题根源是发送方与接收方的JSON序列化规则不统一——原始请求的格式化JSON(带换行、空格)和工作流输出的转义JSON,本质是同一数据的不同序列化形式,直接用字符串计算HMAC必然导致结果不同。以下是可靠的解决方法:

关键思路

先将传入的JSON字符串反序列化为对象,再用标准无格式序列化规则重新生成统一格式的JSON字符串,以此为基础计算HMAC,确保和发送方的计算基准一致。

C#脚本实现(适用于Execute CSharp Script Code)

using System;
using System.Security.Cryptography;
using System.Text;
using Newtonsoft.Json;

// 从工作流输入获取请求头和请求体
var input = workflowContext.Input;
var headers = (dynamic)input["headers"];
var incomingJson = (string)input["requestBody"];
var incomingHmac = headers["X-HMAC-Signature"].ToString().Trim();
var hmacKeyBytes = Encoding.UTF8.GetBytes(headers["X-HMAC-Key"].ToString().Trim());

// 反序列化JSON到对象,再重新生成为无格式的标准JSON
dynamic jsonData = JsonConvert.DeserializeObject(incomingJson);
var normalizedJson = JsonConvert.SerializeObject(jsonData, Formatting.None);

// 计算本地HMAC
string localHmac;
using (var hmacSha256 = new HMACSHA256(hmacKeyBytes))
{
    var hashBytes = hmacSha256.ComputeHash(Encoding.UTF8.GetBytes(normalizedJson));
    localHmac = BitConverter.ToString(hashBytes).Replace("-", "").ToLowerInvariant();
}

// 对比验证并输出结果
workflowContext.Output["HmacValidationResult"] = string.Equals(localHmac, incomingHmac, StringComparison.OrdinalIgnoreCase);

补充说明

  • 若使用System.Text.Json替代Newtonsoft.Json,将序列化代码替换为:
    var normalizedJson = System.Text.Json.JsonSerializer.Serialize(jsonData, new System.Text.Json.JsonSerializerOptions { WriteIndented = false });
    
  • 必须要求发送方采用完全相同的序列化规则生成用于HMAC计算的JSON(无缩进、默认转义),否则仍会出现不匹配。
  • 不要直接处理原始的格式化/转义JSON字符串,反序列化再重序列化是消除格式差异最可靠的方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 14:22:06