【问题标题】:How to handle multi value cookies in ASP.NET Core?如何在 ASP.NET Core 中处理多值 cookie?
【发布时间】:2020-12-19 07:07:44
【问题描述】:

在完整的 .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.Values 并且HttpRequest.Cookies 返回一个IRequestCookieCollection,就像从stringstringdictionary

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

【问题讨论】:

  • 您是否尝试过阅读“旧版”cookie?这可能会提供一些见解。遗留的 NameValueCollection 可以非常直接地序列化到字符串/从字符串序列化。找出为什么核心不原生支持旧的多值 cookie 会很有趣。

标签: c# cookies asp.net-core


【解决方案1】:

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

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

.NET 的Values 属性的官方实现HttpCookie 非常脆弱,它只是将键值对序列化/反序列化到/从字符串中分离出来,& 用于对,= 用于值。

在 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 中获取一些代码,我相信它更健壮一些。

【讨论】:

  • 如何将 Mono HttpCookie 实现集成到一个活生生的 ASP.NET Core 系统中?
  • 请注意,ASP.NET Core 会在 cookie 值中编码您的特殊字符,例如 =。因此,如果您需要与遗留应用程序的互操作性,您需要在这里寻找解决方案:stackoverflow.com/a/48324815
【解决方案2】:

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

签出:https://github.com/nemi-chand/CookieManager

创建你的 poco/object 你想在 cookie 中存储的东西。

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");

【讨论】:

    猜你喜欢
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    相关资源
    最近更新 更多