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

.NET Core 6中Chrome自定义Cookie键冒号前缀丢失问题排查

问题原因

Cookie名称中使用冒号(:)违反了早期Cookie规范(RFC 6265之前的标准),虽然现代浏览器允许写入这类Cookie,但.NET Core默认的Cookie解析逻辑会将冒号识别为Cookie属性的分隔符(比如Domain:、Expires:这类属性前缀),因此会把my:当成无效的属性前缀直接忽略,只保留后面的cookie作为键名。

解决方案

1. 更换Cookie键名(推荐)

直接将Cookie名称中的冒号替换为合规字符,比如下划线(_)或短横线(-),例如my_cookie=myValue。这种方式完全符合Cookie规范,不会有解析兼容性问题。

2. 手动解析原始Cookie请求头

如果必须保留冒号格式,可以绕过.NET默认的Cookie解析,直接读取请求头中的原始Cookie字符串自行解析:

[HttpGet("get-custom-cookie")]
public IActionResult GetCustomCookie()
{
    var rawCookieHeader = Request.Headers.Cookie.ToString();
    if (string.IsNullOrEmpty(rawCookieHeader))
        return BadRequest("No cookies sent");

    // 拆分多个Cookie,处理键值对
    var cookieDict = rawCookieHeader.Split(';')
        .Select(c => c.Trim())
        .Where(c => c.Contains('='))
        .ToDictionary(
            keySelector: c => c.Split('=')[0],
            elementSelector: c => c.Split('=')[1]
        );

    if (cookieDict.TryGetValue("my:cookie", out var cookieValue))
    {
        return Ok($"Successfully retrieved: my:cookie={cookieValue}");
    }
    return NotFound("Target cookie not found");
}

3. 验证原始Cookie内容

要确认是浏览器发送问题还是.NET解析问题,可以在Program.cs中添加一个前置中间件,打印原始的Cookie请求头:

// 放在所有中间件之前,确保最先拦截请求
app.Use(async (context, next) =>
{
    if (context.Request.Headers.TryGetValue("Cookie", out var cookieHeader))
    {
        Console.WriteLine($"Received Raw Cookie: {cookieHeader}");
    }
    await next.Invoke();
});

启动服务后调用API,查看控制台输出的原始Cookie内容,就能明确问题出在客户端发送还是服务端解析环节。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 13:00:08