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

跨域HTTP POST轻量身份认证方案选型咨询(.NET技术栈)

方案推荐:HTTP Message Signatures(RFC 9421)

你当前自研的带时间戳HMAC方案已经非常接近工业标准实现,直接适配 HTTP Message Signatures(原HTTP Signatures,最新标准为RFC 9421)即可,完全匹配你的所有约束条件:

  • 支持共享密钥HMAC、非对称密钥两种签名模式,不需要做证书交换,安全强度符合企业级要求
  • 不需要引入JWT、OAuth2等复杂协议,整体逻辑和你现有实现几乎一致,改造成本极低
  • 原生支持时间戳、nonce字段的规范定义,不需要自定义参数规则,天然解决重放、重复提交问题

适配你场景的实现逻辑

完全兼容你现有隐藏表单POST+target=_blank的跳转流程:

  1. 应用A侧生成表单时,除Payload外,额外生成三个标准字段:
    • sig-created:当前UTC时间戳
    • sig-nonce:单次请求唯一随机串
    • signature:用共享密钥对Payload+sig-created+sig-nonce按标准规则生成的HMAC签名
  2. 应用B侧收到请求后,按以下顺序校验:
    • 校验时间戳是否在你设定的有效窗口内(通常设为5分钟即可)
    • 用相同共享密钥重新计算签名,和请求携带的signature比对是否一致
    • 校验sig-nonce是否在缓存中存在,不存在则缓存该nonce(缓存有效期和时间戳窗口一致),存在则判定为重复提交拒绝请求
  3. 所有校验通过后,按你现有逻辑重定向到应用B内部页面即可

.NET生态适配工具库

.NET 7+ 版本

直接使用微软官方原生支持的 Microsoft.AspNetCore.Authentication.HttpSignatures 库,无第三方依赖,配置简单:

  • 发送端生成签名核心代码:
// 共享密钥提前在两个应用配置好,不要硬编码
byte[] sharedKey = Convert.FromBase64String("你的共享密钥Base64值");
var nonce = Guid.NewGuid().ToString("N");
var createdTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds();

// 生成签名
var signProvider = new HmacSha256SignatureProvider(sharedKey);
var contentHash = ComputeSha256Hash(payloadContent); // 对Payload内容做哈希
var signInput = $"@method=POST;@target-uri=/你的接收路径;content-digest=sha-256=:{contentHash}:;created={createdTime};nonce={nonce}";
var signature = signProvider.SignAsync(Encoding.UTF8.GetBytes(signInput)).Result;

// 把以上参数全部放到隐藏表单字段提交即可
  • 接收端校验配置:
builder.Services.AddAuthentication()
    .AddHttpSignatures(opt =>
    {
        opt.HmacKeys.Add("app-a", sharedKey);
        opt.ValidateCreationTime = true;
        opt.ClockSkew = TimeSpan.FromMinutes(5);
        // 注入你的nonce缓存服务(用分布式内存缓存、Redis都可以)
        opt.Events.OnSignatureValidated = async ctx =>
        {
            var nonce = ctx.SignatureInput.Nonce;
            var cache = ctx.HttpContext.RequestServices.GetRequiredService<IDistributedCache>();
            var existingNonce = await cache.GetStringAsync($"nonce:{nonce}");
            if (existingNonce != null) ctx.Fail("重复提交");
            await cache.SetStringAsync($"nonce:{nonce}", "1", new DistributedCacheEntryOptions { AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(5) });
        };
    });

.NET 6及更早版本

使用开源成熟的 IdentityModel.HttpSignatures 库,功能和官方库完全一致,向下兼容.NET Standard 2.0。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 05:15:03