繁体   English   中英

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

[英]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.ValuesHttpRequest.Cookies返回一个IRequestCookieCollection就像一个从stringstringdictionary

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

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

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

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

在 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM