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

带URL编码加密参数的ASP.NET Core API GET请求无法提交

嘿,我碰到过类似的问题,来帮你捋一捋!

首先,你遇到的核心问题是:RSA加密后的字节数组包含大量URL路径不允许的控制字符,哪怕做了URL编码,浏览器或者ASP.NET Core的路由中间件也会直接拒绝这类请求——这就是为什么你的控制器构造函数断点根本没触发,请求连服务器的处理流程都没进入。

问题出在这两处:

  1. 加密前的字节数组转换错误:你用了HttpUtility.UrlDecodeToBytes处理原始字符串,但你的原始字符串是普通文本("AHMW9GMXQZXYL04EYBIW"),根本没有URL编码,这一步完全没必要,反而可能导致字节数组异常。
  2. URL编码无法解决控制字符问题:RSA加密后的字节数组会包含像%00(空字符)、%1F(控制字符)这类不符合RFC 3986 URL规范的内容,即使URL编码后,浏览器或服务器也会直接拦截请求。

解决方案:改用Base64Url编码

Base64Url编码是专门为URL设计的编码方式,它把所有字节转换成完全符合URL规范的字符(A-Z、a-z、0-9、-、_),不会触发任何拦截。

1. 修正加密字符串生成代码

private string GenerateEncryptedString()
{
    // 用using自动释放RSA资源,避免内存泄漏
    using (var rsaProvider = new RSACryptoServiceProvider())
    {
        // 直接将原始字符串转为UTF8字节数组,无需UrlDecode
        byte[] data = Encoding.UTF8.GetBytes("AHMW9GMXQZXYL04EYBIW");
        byte[] encryptedData = rsaProvider.Encrypt(data, true);
        // 使用ASP.NET Core内置的WebEncoders做Base64Url编码
        string encryptedString = WebEncoders.Base64UrlEncode(encryptedData);
        return encryptedString;
    }
}

2. 调整API动作方法的解码逻辑

[HttpGet("[action]/{encrypted}")]
public string DoAction(string encrypted)
{
    using (var rsaProvider = new RSACryptoServiceProvider())
    {
        // 解码Base64Url字符串为字节数组
        byte[] encryptedData = WebEncoders.Base64UrlDecode(encrypted);
        // 注意:这里要确保RSA密钥和加密时完全一致
        byte[] decryptedData = rsaProvider.Decrypt(encryptedData, true);
        string originalContent = Encoding.UTF8.GetString(decryptedData);
        return $"Executed successfully! Original content: {originalContent}";
    }
}

额外提醒

  • 如果你传输的是敏感数据,尽量不要用GET请求——URL会被记录在浏览器历史、服务器日志、代理日志里,改用POST请求把加密数据放在请求体里更安全。
  • RSA密钥一定要妥善管理,别硬编码在代码里,建议放在配置文件或者专门的密钥管理服务中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:56:08