在 ASP.NET Core 實作 GDPR
TLDR
- GDPR 要求網站必須告知使用者 Cookie 使用情況,並在使用者同意前限制非必要 Cookie 的寫入。
- ASP.NET Core 透過
CookiePolicyOptions與UseCookiePolicy中介軟體 (Middleware) 來管理 Cookie 同意機制。 - 若需強制使用者同意後才能寫入非必要 Cookie,需將
CheckConsentNeeded設定為true。 - 標記為
IsEssential = true的 Cookie,即使使用者未同意也能正常寫入,適用於網站運作所必需的資料。 - 實作時可利用
ITrackingConsentFeature檢查使用者是否已同意追蹤,並透過CreateConsentCookie()產生同意標記。
GDPR 實作核心概念
GDPR 要求網站針對歐盟個人的資料及隱私進行規範。在實作 Cookie 同意橫幅 (Consent Banner) 時,常見的處理邏輯如下:
- 告知使用者網站使用 Cookie 的情況,並提供隱私權政策頁面連結。
- 關閉提示訊息的處理:
- 僅關閉:畫面上暫時隱藏,重新整理後會再次出現。
- 同意:寫入同意標記 (Flag) 的 Cookie,後續不再顯示提示,並依此標記決定是否寫入其他非必要 Cookie。
- 預防性保護:在使用者同意前,應停止寫入非必要性的 Cookie。
ASP.NET Core 的 GDPR 實作方式
ASP.NET Core 提供了內建的機制來處理 Cookie 同意流程,主要透過 CookiePolicyOptions 進行設定。
設定 CookiePolicyOptions
在 Program.cs 中設定 CookiePolicyOptions,並啟用 UseCookiePolicy 中介軟體。
csharp
builder.Services.Configure<CookiePolicyOptions>(options => {
// 設定為 true 時,系統會檢查使用者是否已同意,未同意前限制非必要 Cookie 寫入
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
// ...其他程式碼...
app.UseCookiePolicy(); // Cookie 相關 Middleware建立 Cookie 同意橫幅
在 _CookieConsentPartial.cshtml 中,利用 ITrackingConsentFeature 判斷是否顯示橫幅,並處理同意按鈕的點擊事件。
什麼情況下會遇到這個問題:當你需要根據使用者的同意狀態,動態顯示或隱藏 Cookie 提示橫幅時。
html
@using Microsoft.AspNetCore.Http.Features
@{
var consentFeature = Context.Features.Get<ITrackingConsentFeature>();
var showBanner = !consentFeature?.CanTrack ?? false;
var cookieString = consentFeature?.CreateConsentCookie();
}
@if (showBanner) {
<div id="cookieConsent" class="alert alert-info alert-dismissible fade show" role="alert">
Use this space to summarize your privacy and cookie use policy. <a asp-page="/Privacy">Learn More</a>.
<button type="button" class="accept-policy close" data-dismiss="alert" aria-label="Close" data-cookie-string="@cookieString">
<span aria-hidden="true">Accept</span>
</button>
</div>
<script>
(function () {
var button = document.querySelector("#cookieConsent button[data-cookie-string]");
button.addEventListener("click", function (event) {
document.cookie = button.dataset.cookieString;
}, false);
})();
</script>
}處理必要性 Cookie
有些 Cookie 是網站正常運作所必需的(例如購物車或身分驗證),即使使用者尚未同意隱私政策,這些 Cookie 仍需寫入。
什麼情況下會遇到這個問題:當網站有部分功能(如登入狀態)依賴 Cookie,且該功能在使用者點擊「同意」前就必須運作時。
csharp
Response.Cookies.Append("name", "value", new CookieOptions {
IsEssential = true // 將此 Cookie 標記為必要的,不受同意機制限制
});異動歷程
- 2022-10-27 初版文件建立。
