首页 > 解决方案 > MVC5 Cookie和chrome相同的站点问题

问题描述

我正在尝试使用以下工具使用 MVC5 构建电子商务:-Visual Studio 2017、Oracle DB 11g、Entity Framework 6、.NET Framework 4.6.2,我正在使用带有无效证书的 https 进行测试。我在应用程序中创建自己的 cookie 以保存用户的选择和收藏项目,我通过删除 cookie 手动添加项目,并在客户添加或删除的每个项目之后放置新的更新的项目,在 Firefox 上一切正常,但是当我尝试从 Chrome 查看应用程序时,我收到以下消息:

与http://localhost/上的资源关联的 cookie设置为带SameSite=None但不带Secure. 它已被阻止,因为 Chrome 现在仅SameSite=None在它们也被标记时才提供标记的 cookie Secure

这是我的创建 cookie 代码:

public HttpCookie CookieWareFromBrowser ()
{
    var ItemsCart = HttpContext.Current.Request.Cookies.Get(Models.StaticModels.CookiesManagedStrings.ItemsCart);    
    if (ItemsCart==null)
    {
        HttpCookie _ItemsCart = new HttpCookie(Models.StaticModels.CookiesManagedStrings.ItemsCart);


        _ItemsCart.Values.Add(Models.StaticModels.CookiesManagedStrings.Items, "|");                                       
        _ItemsCart.Values.Add(Models.StaticModels.CookiesManagedStrings.ItemsCount, "0");

        _ItemsCart.Expires = System.DateTime.Now.AddDays(1);

        HttpContext.Current.Request.Cookies.Set(_ItemsCart);


        HttpContext.Current.Response.SetCookie(_ItemsCart);
        HttpContext.Current.Response.Flush(); 

        return _ItemsCart;
    }
    ItemsCart.Expires = System.DateTime.Now.AddDays(1);

    return ItemsCart;
}

将项目添加到 cookie 代码:

public IHttpActionResult AddItemToCart(CartItem cartItem)
{
    var _cookie = new CookiesMaster().CookieWareFromBrowser();
    var Cookieitems = CookiesManagedStrings.decryptingCooki(_cookie.Values[CookiesManagedStrings.Items]);
    if (string.IsNullOrEmpty(Cookieitems.Split('|').SingleOrDefault(s => s.Contains(cartItem.Id.ToString()))))

        _cookie.Values[CookiesManagedStrings.Items] = CookiesManagedStrings.encryptingCooki(Cookieitems + cartItem.Id + "," + cartItem.ProductName.Replace(",", "") + "," + cartItem.IValue + "," + cartItem.Quantity + "|");
    else
    {
        var item = Cookieitems.Split('|').Where(s => !string.IsNullOrEmpty(s)).SingleOrDefault(si => si.Contains(cartItem.Id.ToString()));
        var oldQty = int.Parse(item.Substring(item.LastIndexOf(',') + 1));
        var productbalance = _context.storage.Single(p => p.id== cartItem.Id && p.M_LOCATOR_ID == M_ProductManagedStrings.ID).FREE_BALANCE;

        if (productbalance >= oldQty + cartItem.Quantity)
        {
            var newItem = item.Substring(0, item.LastIndexOf(',') + 1) + (oldQty +cartItem.Quantity);

            Cookieitems = string.Join("|", Cookieitems.Split('|').Select(s => s.Replace(item, newItem)));
            _cookie.Values[CookiesManagedStrings.Items] = CookiesManagedStrings.encryptingCooki(Cookieitems);
        }
        else return BadRequest("Item Qty Exceeds Balance");
    }
    int x = 0;
    var v = CookiesManagedStrings.decryptingCooki(_cookie.Values[CookiesManagedStrings.ItemsCount]);
    if (int.TryParse(v, out x))
    {               
        _cookie.Values[CookiesManagedStrings.ItemsCount] = CookiesManagedStrings.encryptingCooki((int.Parse(v) + 1).ToString());
    }
    else
    {
        _cookie.Values[CookiesManagedStrings.ItemsCount] = CookiesManagedStrings.encryptingCooki(0.ToString());
    }
    HttpContext.Current.Response.Cookies.Remove(CookiesManagedStrings.ItemsCart);
    HttpContext.Current.Response.Cookies.Add(_cookie);
    HttpContext.Current.Response.Cookies.Set(_cookie);

    return Ok(_cookie.Values[CookiesManagedStrings.ItemsCount]);
}

标签: asp.net-mvcgoogle-chromecookiesasp.net-mvc-5

解决方案


在互联网上进行多次搜索后,我找到了两个解决方案 A-如果您使用的 .netframe 工作低于 4.7.2,则在您的 web.config 中添加以下内容

 <system.web>
<anonymousIdentification cookieRequireSSL="false" />
    <sessionState cookieSameSite="Lax" />
    <roleManager cookieRequireSSL="false" />   
    <authentication mode="None" />
</system.web>

B-如果您使用的 .net 框架高于 4.6.2,您将根据您的配置通过以下选项之一在您的 cookie 中填充属性 samesite:Strict|Lax|None|Unspecified 或者您可以添加到您的 web.config以下 :

 <system.web>
  <httpCookies sameSite="[Strict|Lax|None|Unspecified]" requireSSL="[true|false]" />
 <system.web>

推荐阅读