Julian
Julian

Reputation: 36830

How to handle multi value cookies in ASP.NET Core?

In the full .NET framework we have support for multi value cookies. e.g. a cookie could have multiple values:

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

See also the docs about HttpCookie.Values on MSDN and ASP.NET Cookies Overview on MSDN.

With ASP.NET Core, the multi value cookie seems to be gone. There is no HttpCookie.Values and HttpRequest.Cookies returns a IRequestCookieCollection which is like a dictionary from string to string

How should I now create and read multi value cookies in ASP.NET Core? How could I read the multi value cookies created in Full ASP.NET and read them in ASP.NET Core?

Upvotes: 11

Views: 10888

Answers (2)

Nemi Chand
Nemi Chand

Reputation: 146

CookieManager wrapper allows you to play with objects. you can easily read/write object in asp.net core. it offers you to encrypt the cookie value to secure your data

check out: https://github.com/nemi-chand/CookieManager

Create your poco/object what you want to store in cookie.

public class MyCookie
{
  public string Id { get; set; }

  public DateTime Date { get; set; }

  public string Indentifier { get; set; }
}

fill the object values

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

set the myCookie object

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

get the myCookie object

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

Upvotes: 4

Federico Dipuma
Federico Dipuma

Reputation: 18295

I believe that ASP.NET Core removed the support for the old legacy multi-value cookies because this feature was never standardized.

The RFC definition for cookies explicitly states that using the Set-Cookie header you can assign a single name/value pair, with optionally metadata associated.

The official implementation of Values property for .NET HttpCookie is very brittle, and just serializes/deserializes key-value pairs to/from a string with separators & for pairs and = for values.

Mocking this behavior in ASP.NET core should be fairly easy, you could use extension methods to handle those legacy formatted cookies:

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

Using them like this:

// 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());

Demo: https://dotnetfiddle.net/7KrJ5S

If you need a more complex serialization/deserialization logic (which handles formatting errors and escapes characters in cookie values) you should look and grab some code from the Mono HttpCookie implementation, which, I believe, is a little more robust.

Upvotes: 35

Related Questions