ASP.NET Core2.1 Cookie存取的問題
https://www.cnblogs.com/GuZhenYin/p/9154447.html
ASP.NET Core已經迭代到2.1版本了.發現..cookie竟然存不進去了.
是因為從ASP.NET Core2.1開始,我們的ASP.NET開始可以支援GDPR規範了,(而且順帶他生成的模版,直接就幫你開啟了.)
那麼什麼是GDPR規範呢?
百度百科如下:
《通用資料保護條例》(General Data Protection Regulation,簡稱GDPR)為歐洲聯盟於2018年5月25日出臺的條例,前身是歐盟在1995年制定的《計算機資料保護法》。
注意出臺時間..2018年5月25號..我去啊 才出來就支援了..還真是與時俱進..
那麼這個東西和存不進Cookie有什麼關係呢?
因為這個條例把cookie限制為使用者隱私資料,如果要使用的話,必須徵得使用者同意.
而且在ASP.NET Core2.1的官方專案模板在建立的Razor Pages和MVC專案的時候,會自動幫你新增這個GDPR協議的支援.so..就存不進去了..
大概在模版中幫我們生成了如下內容:
- 在Startup設定了 CookiePolicyOptions和UseCookiePolicy
- 新增_CookieConsentPartial.cshtml 區域性檢視。
- 在根目錄/ Privacy.cshtml或主頁/ Privacy.cshtml檢視提供了一個頁面,讓你詳細說明你的網站的隱私政策。上面的_CookieConsentPartial.cshtml檔案會生成一個連結到這個頁面。
- 對於使用個人使用者帳戶建立的應用程式,管理頁面提供了下載和刪除個人使用者資料的連結。
我們來看看它新增的內容(這裡因為沒用到UseCookiePolicy,所以我們暫且不論).
在Startup中的ConfigureServices方法,我們找到設定CookiePolicyOptions的程式碼如下:
services.Configure<CookiePolicyOptions>(options => { // This lambda determines whether user consent for non-essential cookies // is needed for a given request. options.CheckConsentNeeded = context => true; options.MinimumSameSitePolicy = SameSiteMode.None; });
其實,到這裡,我們基本就已經解決了cookie存不進去的問題..我們可以看到他預設設定CheckConsentNeeded 為true了.我們只需要設定為false.或者刪除這一段程式碼,那麼我們的 cookie就能正常的使用了
但是,既然歐盟出臺了這個規範,雖然管不到中國..估計遲早要全球推廣或者你做的是歐盟國際的專案,就必然要支援..所以我們繼續往下看..
我們找到 _CookieConsentPartial.cshtml區域性檢視
在如圖位置:
我們開啟,會發現裡面是一句提示,有同意和了解更多的一些選項,我們翻譯一下,執行專案,效果如下:
不過這時候你要是滿心歡喜的點了同意..那就需要多看看JS了..我們會發現,這個同意所對應的JS裡面的相關程式碼並沒有寫完..
那我們自己把他補充完整.
首先我們新增控制器方法如下:
public bool OkCookie() { var consentFeature = HttpContext.Features.Get<ITrackingConsentFeature>(); consentFeature.GrantConsent(); return true; }
也就是讓該使用者同意使用cookie並做上標記.(原理其實就是在cookie中添加了一個標記,如果有這個標記就是同意了.可以自行檢視原始碼)
然後我們新增JS指令碼如下:
(function () { document.querySelector("#cookieConsent button[data-cookie-string]").addEventListener("click", function (el) { document.cookie = el.target.dataset.cookieString; // document.querySelector("#cookieConsent").classList.add("hidden"); $.post("@Url.Action("OkCookie","Home")", "", function () { document.querySelector("#cookieConsent").classList.add("hidden"); } ) }, false); })();
訪問我們剛剛的方法,並隱藏這個提示.
這時候我們點選同意,會發現cookie中多出一個標記 如下:
然後我們在儲存我們的cookie就可以成功了.
效果如下:
本來,文章到此就結束了..但是其實關於cookie.我問了一圈周邊同事,感覺大家都是不甚瞭解的樣子..
下面也就順便說一說ASP.NET Core 中關於cookie的使用.
ASP.NET Core 關於Cookie的一些使用
1.儲存cookie.程式碼如下:
Guid date = Guid.NewGuid(); Response.Cookies.Append("UserName666", date.ToString());
2.設定cookie屬性
與之前的asp.net 不同,設定cookie的詳細屬性值,不在是new一個HttpCookie物件了..
而是在Append的時候多了一個引數,為CookieOptions
使用方法如下:
Response.Cookies.Append("8888", "999999", new CookieOptions() { HttpOnly = true, Secure = true });
幾個常用的cookie屬性解釋一下:
2.1 HttpOnly
設定為後臺只讀模式,前端無法通過JS來獲取cookie值,可以有效的防止XXS攻擊
2.2 Secure
採用安全模式來傳遞cookie,如果設定為true,就是當你的網站開啟了SSL(就是https),的時候,這個cookie值才會被傳遞
2.3 MaxAge
cookie的有效毫秒數,如果設定為負值的話,則為瀏覽器程序Cookie(記憶體中儲存),關閉瀏覽器就失效;如果設定為0,則立即刪除該Cookie。
2.4 IsEssential
是否強制儲存cookie,注意,這裡的強制 是針對於上面所講的內容的..也就是當用戶不同意使用cookie的時候,你也可以通過設定這個屬性為true把cookie強制儲存.