c# - 如何在 ASP.NET Core 中处理多值 cookie?

标签 c# cookies asp.net-core

在完整的 .NET 框架中,我们支持多值 cookie。例如一个 cookie 可以有多个值:

HttpCookie aCookie = new HttpCookie("userInfo");
aCookie.Values["userName"] = "patrick";
aCookie.Values["lastVisit"] = DateTime.Now.ToString();

另见 the docs about HttpCookie.Values on MSDNASP.NET Cookies Overview on MSDN .

在 ASP.NET Core 中,多值 cookie 似乎消失了。没有 HttpCookie.ValuesHttpRequest.Cookies返回 IRequestCookieCollection这就像一个从 stringstring

dictionary

我现在应该如何在 ASP.NET Core 中创建和读取多值 cookie?我如何读取在 Full ASP.NET 中创建的多值 cookie 并在 ASP.NET Core 中读取它们?

最佳答案

我相信 ASP.NET Core 删除了对旧的遗留多值 cookie 的支持,因为此功能从未标准化。

RFC definition for cookies明确声明使用 Set-Cookie header 您可以分配单个名称/值对,并可选地关联元数据。

.NET HttpCookieValues 属性的官方实现非常脆弱,只是将键值对序列化/反序列化为带有分隔符的字符串,或者从字符串中序列化/反序列化 & 用于对,= 用于值。

在 ASP.NET Core 中模拟这种行为应该相当容易,您可以使用扩展方法来处理那些遗留格式的 cookie:

public static class LegacyCookieExtensions
{
    public static IDictionary<string, string> FromLegacyCookieString(this string legacyCookie)
    {
        return legacyCookie.Split('&').Select(s => s.Split('=')).ToDictionary(kvp => kvp[0], kvp => kvp[1]);
    }

    public static string ToLegacyCookieString(this IDictionary<string, string> dict)
    {
        return string.Join("&", dict.Select(kvp => string.Join("=", kvp.Key, kvp.Value)));
    }
}

像这样使用它们:

// read the cookie
var legacyCookie = Request.Cookies["userInfo"].FromLegacyCookieString();
var username = legacyCookie["userName"];

// write the cookie
var kvpCookie = new Dictionary<string, string>()
{
    { "userName", "patrick" },
    { "lastVisit", DateTime.Now.ToString() }
};
Response.Cookies.Append("userInfo", kvpCookie.ToLegacyCookieString());

演示:https://dotnetfiddle.net/7KrJ5S

如果您需要更复杂的序列化/反序列化逻辑(处理格式错误和转义 cookie 值中的字符),您应该从 Mono HttpCookie implementation 中查找并获取一些代码,我相信它更强大一些。

关于c# - 如何在 ASP.NET Core 中处理多值 cookie?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43701126/

相关文章:

c# - Prism RequestNavigate 和 ViewModel OnPropertyChanged

c# - 具有不同 DTO 的 View 模型之间的 MVVM 通信

javascript - 使用jquery中的一个脚本创建cookie并使用另一个脚本yui/或任何东西访问相同的cookie

javascript - Chrome 跨站点资源 - 网站无法正常工作

json - 服务未监听 Hosting.json 中的端口

ubuntu - DotNet Core 应用程序不接受 Linux 上的 POST

c# - 在域模型中使用集合/容器/目录

c# - 自定义 JsonConverter 在不应该使用 TokenType "EndObject"的情况下获取阅读器

java - 在 Java 中检索正确 cookie 的问题

c# - 如何防止用户登录多个设备以及如何从之前的设备结束 session ?