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

.NET Framework迁移至.NET Core的防伪令牌兼容问题咨询

.NET Framework与.NET Core防伪令牌兼容配置方案

核心逻辑

要实现.NET Framework前端表单提交到.NET Core后端时的防伪令牌验证,必须让两者共享一致的加密密钥、算法配置和应用标识,同时让.NET Core的DataProtection系统兼容.NET Framework的machineKey令牌格式。


1. 统一算法配置

两边必须使用匹配的加密/验证算法:

  • 加密算法:AES(两边保持一致)
  • 验证算法:HMACSHA1(对应.NET Framework的validation="SHA1"配置)

2. .NET Framework侧配置

放弃自动生成密钥(AutoGenerate)和路径存储方式,手动指定固定密钥,修改Web.config的machineKey节点:

<machineKey
    validationKey="替换为Base64格式的HMAC验证密钥"
    decryptionKey="替换为Base64格式的AES加密密钥"
    validation="HMACSHA1"
    decryption="AES" />

注意:不要使用validationKeyPath/decryptionKeyPath,因为.NET Core的密钥存储格式无法被.NET Framework的路径读取机制直接识别,手动指定密钥是最可靠的兼容方式。


3. .NET Core侧配置

配置DataProtection系统,启用.NET Framework兼容模式,并与.NET Framework共享密钥和应用标识:

builder.Services.AddDataProtection()
    // 必须与.NET Framework侧的应用标识一致(可自定义,两边统一即可)
    .SetApplicationName("YourAppName")
    // 指定与.NET Framework匹配的算法
    .UseCryptographicAlgorithms(new CryptographicAlgorithmConfiguration
    {
        EncryptionAlgorithm = EncryptionAlgorithm.AES_256_CBC,
        ValidationAlgorithm = ValidationAlgorithm.HMACSHA1
    })
    // 密钥存储目录(可选,若需持久化密钥)
    .PersistKeysToFileSystem(new DirectoryInfo(@"c:\temp-keys\"))
    // 启用跨平台加密兼容,识别.NET Framework格式的令牌
    .EnableCrossPlatformCryptography()
    // 指定与.NET Framework匹配的密钥派生算法
    .AddKeyDerivation(KeyDerivationPrf.HMACSHA1);

密钥同步方式

方式A:从.NET Core生成密钥后同步到.NET Framework

  1. 启动.NET Core应用,密钥会自动生成并存储到指定目录(c:\temp-keys\)
  2. 打开密钥XML文件,提取encryptionKey和validationKey的Base64值
  3. 将这两个值分别填入.NET Framework的decryptionKey和validationKey节点

方式B:从现有.NET Framework密钥同步到.NET Core

  1. 从.NET Framework的Web.config中复制validationKey和decryptionKey的值
  2. 在.NET Core中通过IKeyManager手动导入密钥(或直接将密钥转换为.NET Core的XML格式存入存储目录)

4. YARP代理配置要点

确保YARP转发请求时完整传递防伪令牌相关的HTTP头:

  • Cookie:包含防伪令牌的Cookie(默认名称为__RequestVerificationToken)
  • RequestVerificationToken:表单提交的防伪令牌字段

示例YARP配置(appsettings.json):

"ReverseProxy": {
  "Routes": {
    "apiRoute": {
      "ClusterId": "coreBackend",
      "Match": {
        "Path": "/api/{**catch-all}"
      },
      "Transforms": [
        { "RequestHeader": "Cookie", "Keep": true },
        { "RequestHeader": "RequestVerificationToken", "Keep": true }
      ]
    }
  },
  "Clusters": {
    "coreBackend": {
      "Destinations": {
        "coreServer": {
          "Address": "https://your-netcore-backend.com/"
        }
      }
    }
  }
}

5. 验证步骤

  1. 在.NET Framework页面中查看生成的__RequestVerificationToken Cookie和表单字段值
  2. 提交表单后,用抓包工具确认令牌被完整转发到.NET Core后端
  3. 在.NET Core接口上添加[ValidateAntiForgeryToken]特性,验证请求是否能通过

常见问题排查

  • 令牌验证失败:检查两边的应用名称、算法、密钥是否完全一致;确认YARP未过滤相关HTTP头
  • 密钥格式错误:确保密钥是纯Base64字符串,无额外空格或特殊字符;.NET Framework的密钥区分大小写

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 18:52:47