[英]How to handle multi value cookies in ASP.NET Core?
在完整的 .NET 框架中,我们支持多值 cookie。 例如,一个 cookie 可以有多个值:
HttpCookie aCookie = new HttpCookie("userInfo");
aCookie.Values["userName"] = "patrick";
aCookie.Values["lastVisit"] = DateTime.Now.ToString();
另请参阅MSDN 上关于HttpCookie.Values
的文档和MSDN 上的ASP.NET Cookies 概述。
使用 ASP.NET Core,多值 cookie 似乎消失了。 没有HttpCookie.Values
和HttpRequest.Cookies
返回一个IRequestCookieCollection
就像一个从string
到string
的dictionary
我现在应该如何在 ASP.NET Core 中创建和读取多值 cookie? 如何读取在 Full ASP.NET 中创建的多值 cookie 并在 ASP.NET Core 中读取它们?
我相信 ASP.NET Core 删除了对旧的遗留多值 cookie 的支持,因为此功能从未标准化。
cookie的RFC 定义明确指出,使用Set-Cookie
标头,您可以分配单个名称/值对,并可选择关联元数据。
.NET HttpCookie
的Values
属性的官方实现非常脆弱,只是将键值对序列化/反序列化到/从带有分隔符的字符串中/反序列化为分隔符&
用于对和=
用于值。
在 ASP.NET 核心中模拟这种行为应该相当容易,您可以使用扩展方法来处理那些遗留格式的 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 中获取一些代码,我相信它更健壮一些。
CookieManager包装器允许您使用对象。 您可以轻松地在 asp.net core 中读/写对象。 它为您提供加密 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<MyCookie>("Key");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.