带URL编码加密参数的ASP.NET Core API GET请求无法提交
嘿,我碰到过类似的问题,来帮你捋一捋!
首先,你遇到的核心问题是:RSA加密后的字节数组包含大量URL路径不允许的控制字符,哪怕做了URL编码,浏览器或者ASP.NET Core的路由中间件也会直接拒绝这类请求——这就是为什么你的控制器构造函数断点根本没触发,请求连服务器的处理流程都没进入。
问题出在这两处:
- 加密前的字节数组转换错误:你用了
HttpUtility.UrlDecodeToBytes处理原始字符串,但你的原始字符串是普通文本("AHMW9GMXQZXYL04EYBIW"),根本没有URL编码,这一步完全没必要,反而可能导致字节数组异常。 - 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
相关产品推荐
相关产品推荐

