跨域HTTP POST轻量身份认证方案选型咨询(.NET技术栈)
方案推荐:HTTP Message Signatures(RFC 9421)
你当前自研的带时间戳HMAC方案已经非常接近工业标准实现,直接适配 HTTP Message Signatures(原HTTP Signatures,最新标准为RFC 9421)即可,完全匹配你的所有约束条件:
- 支持共享密钥HMAC、非对称密钥两种签名模式,不需要做证书交换,安全强度符合企业级要求
- 不需要引入JWT、OAuth2等复杂协议,整体逻辑和你现有实现几乎一致,改造成本极低
- 原生支持时间戳、nonce字段的规范定义,不需要自定义参数规则,天然解决重放、重复提交问题
适配你场景的实现逻辑
完全兼容你现有隐藏表单POST+target=_blank的跳转流程:
- 应用A侧生成表单时,除Payload外,额外生成三个标准字段:
sig-created:当前UTC时间戳sig-nonce:单次请求唯一随机串signature:用共享密钥对Payload+sig-created+sig-nonce按标准规则生成的HMAC签名
- 应用B侧收到请求后,按以下顺序校验:
- 校验时间戳是否在你设定的有效窗口内(通常设为5分钟即可)
- 用相同共享密钥重新计算签名,和请求携带的
signature比对是否一致 - 校验
sig-nonce是否在缓存中存在,不存在则缓存该nonce(缓存有效期和时间戳窗口一致),存在则判定为重复提交拒绝请求
- 所有校验通过后,按你现有逻辑重定向到应用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
相关产品推荐
相关产品推荐

