微信开放平台扫码登录回调后 state 参数丢失遗漏的解决方案

根据微信开放文档,在请求 code 时我们可以提供一个名为 state 的参数。该参数用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验。

根据该文档,笔者将用户的返回地址传递到了 state 中,以实现登录成功后跳转的功能。如果返回路径不包含或仅包含一个 Query String 参数时,代码可以正常工作,如果有 1 个以上的参数,则第二个既之后的参数不会被返回。

为了解决该问题,笔者将返回地址进行了 Base64 转码。再次测试时问题依旧:微信回调时没有对 state 参数进行编码(url encode)造成 Query String 部分以双等号结尾:接收参数不完整导致 URL 解码失败。

一个简单易行的方案就是将这些需要编码的字符替换成无需编码的字符,应用以下代码之后该问题得到解决:

public static string Encode(byte[] bytes)
{
    if (bytes.IsNullOrEmpty())
    {
        return string.Empty;
    }
    var str = Convert.ToBase64String(bytes);
    str = str.Replace("+", "-").Replace("/", "_");
    return str;
}
public static byte[] Decode(string str)
{
    if (string.IsNullOrWhiteSpace(str))
    {
        return new byte[0];
    }
    str = str.Replace("-", "+").Replace("_", "/");
    var data = Convert.FromBase64String(str);
    return data;
}

以上代码将 Base64 编码算法中用到的 “+” 和 “/” 这两个需要参与到 URL 编码的算法进行了替换和还原,从而规避了微信不对参数编码的问题。

来源:https://www.coderbusy.com/archives/1676.html

posted @   Soar、毅  阅读(2290)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示