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

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

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

另请参阅有关MSDN上的HttpCookie.Values和MSDN上的 ASP.NET Cookie概述 的文档 。

使用ASP.NET Core,多值cookie似乎消失了。 没有HttpCookie.ValuesHttpRequest.Cookies返回一个IRequestCookieCollection ,就像从stringstringdictionary一样

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

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

Cookie的RFC定义明确指出,使用Set-Cookie标头,您可以分配单个名称/值对,并可选择关联元数据。

.NET HttpCookieValues属性的官方实现非常脆弱,只是将字符串序列化/反序列化为带有分隔符的字符串,对于对和/为值。

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

 public static class LegacyCookieExtensions { public static IDictionary FromLegacyCookieString(this string legacyCookie) { return legacyCookie.Split('&').Select(s => s.Split('=')).ToDictionary(kvp => kvp[0], kvp => kvp[1]); } public static string ToLegacyCookieString(this IDictionary 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() { { "userName", "patrick" }, { "lastVisit", DateTime.Now.ToString() } }; Response.Cookies.Append("userInfo", kvpCookie.ToLegacyCookieString()); 

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

如果你需要一个更复杂的序列化/反序列化逻辑(处理格式化错误并转义cookie值中的字符),你应该从Mono HttpCookie实现中查找并获取一些代码,我认为这些代码更强大一些。

CookieManager包装器允许您使用对象。 你可以在asp.net核心中轻松读/写对象。 它可以让您加密cookie值以保护您的数据

退房: https : //github.com/nemi-chand/CookieManager

创建您想要存储在cookie中的poco / object。

 public class MyCookie { public string Id { get; set; } public DateTime Date { get; set; } public string Indentifier { get; set; } } 

填充对象值

 MyCookie cooObj= new MyCookie() { Id = Guid.NewGuid().ToString(), Indentifier = "valueasgrsdgdf66514sdfgsd51d65s31g5dsg1rs5dg", Date = DateTime.Now }; 

设置myCookie对象

 _cookieManager.Set("Key", cooObj, 60); 

获取myCookie对象

 MyCookie objFromCookie = _cookieManager.Get("Key");