Dukungan Peraturan Perlindungan Data Umum (GDPR) UE di ASP.NET Core
Oleh Rick Anderson
ASP.NET Core menyediakan API dan templat untuk membantu memenuhi beberapa persyaratan Peraturan Perlindungan Data Umum (GDPR) UE:
- Templat proyek mencakup titik ekstensi dan markup terstubbed yang dapat Anda ganti dengan kebijakan penggunaan dan cookie Andaprivacy.
- Halaman
Pages/Privacy.cshtml
atauViews/Home/Privacy.cshtml
tampilan menyediakan halaman untuk merinci kebijakan situs privacy Anda.
Untuk mengaktifkan fitur persetujuan default cookie seperti yang ditemukan di templat ASP.NET Core 2.2 dalam aplikasi yang dihasilkan templat ASP.NET Core saat ini, tambahkan kode yang disorot berikut ke Program.cs
:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.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;
});
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Dalam kode sebelumnya, CookiePolicyOptions dan UseCookiePolicy digunakan.
cookie Tambahkan sebagian persetujuan ke
_Layout.cshtml
file:@*Previous markup removed for brevity*@ </header> <div class="container"> <partial name="_CookieConsentPartial" /> <main role="main" class="pb-3"> @RenderBody() </main> </div> <footer class="border-top footer text-muted"> <div class="container"> © 2022 - WebGDPR - <a asp-area="" asp-page="/Privacy">Privacy</a> </div> </footer> <script src="~/lib/jquery/dist/jquery.min.js"></script> <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script> <script src="~/js/site.js" asp-append-version="true"></script> @await RenderSectionAsync("Scripts", required: false) </body> </html>
_CookieConsentPartial.cshtml
Tambahkan file ke proyek:@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-bs-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> }
Pilih versi ASP.NET Core 2.2 dari artikel ini untuk membaca tentang cookie fitur persetujuan.
Mengkustomisasi cookie nilai persetujuan
Tentukan nilai yang digunakan untuk melacak apakah pengguna menyetujui cookie kebijakan penggunaan menggunakan CookiePolicyOptions.ConsentCookieValue
properti :
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
options.ConsentCookieValue = "true";
});
var app = builder.Build();
Enkripsi di rest
Beberapa database dan mekanisme penyimpanan memungkinkan enkripsi di rest. Enkripsi di rest:
- Mengenkripsi data yang disimpan secara otomatis.
- Mengenkripsi tanpa konfigurasi, pemrograman, atau pekerjaan lain untuk perangkat lunak yang mengakses data.
- Adalah opsi term mudah dan paling aman.
- Memungkinkan database mengelola kunci dan enkripsi.
Contohnya:
- Microsoft SQL dan Azure SQL menyediakan Transparent Data Encryption (TDE).
- SQL Azure mengenkripsi database secara default
- Azure Blobs, Files, Table, dan Queue Storage dienkripsi secara default.
Untuk database yang tidak menyediakan enkripsi bawaan di rest, Anda mungkin dapat menggunakan enkripsi disk untuk memberikan perlindungan yang sama. Contohnya:
Sumber Daya Tambahan:
- Templat proyek mencakup titik ekstensi dan markup terstubbed yang dapat Anda ganti dengan kebijakan penggunaan dan cookie Andaprivacy.
- cookie Fitur persetujuan memungkinkan Anda meminta (dan melacak) persetujuan dari pengguna Anda untuk menyimpan informasi pribadi. Jika pengguna belum menyetujui pengumpulan data dan aplikasi telah CheckConsentNeeded diatur ke
true
, cookie yang tidak penting tidak dikirim ke browser. - Cookie dapat ditandai sebagai penting. Cookie penting dikirim ke browser bahkan ketika pengguna belum menyetujui dan pelacakan dinonaktifkan.
- Cookie TempData dan Sesi tidak berfungsi saat pelacakan dinonaktifkan.
- Halaman Identity kelola menyediakan tautan untuk mengunduh dan menghapus data pengguna.
Aplikasi sampel memungkinkan Anda menguji sebagian besar titik ekstensi GDPR dan API yang ditambahkan ke templat ASP.NET Core 2.1. Lihat file ReadMe untuk instruksi pengujian.
Melihat atau mengunduh kode sampel (cara mengunduh)
ASP.NET dukungan Core GDPR dalam kode yang dihasilkan templat
Razor Halaman dan proyek MVC yang dibuat dengan templat proyek mencakup dukungan GDPR berikut:
- CookiePolicyOptions dan UseCookiePolicy diatur di
Startup
kelas . - Tampilan parsial _CookieConsentPartial.cshtml. Tombol Terima disertakan dalam file ini. Ketika pengguna mengklik tombol Terima , persetujuan untuk menyimpan cookie disediakan.
- Halaman
Pages/Privacy.cshtml
atauViews/Home/Privacy.cshtml
tampilan menyediakan halaman untuk merinci kebijakan situs privacy Anda. File _CookieConsentPartial.cshtml menghasilkan tautan ke Privacy halaman. - Untuk aplikasi yang dibuat dengan akun pengguna individual, halaman Kelola menyediakan tautan untuk mengunduh dan menghapus data pengguna pribadi.
CookiePolicyOptions dan UseCookiePolicy
CookiePolicyOptions diinisialisasi dalam Startup.ConfigureServices
:
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services
// to the container.
public void ConfigureServices(IServiceCollection services)
{
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;
});
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddDefaultIdentity<IdentityUser>()
.AddEntityFrameworkStores<ApplicationDbContext>();
// If the app uses session state, call AddSession.
// services.AddSession();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
// This method gets called by the runtime. Use this method to configure the
// HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseAuthentication();
// If the app uses session state, call Session Middleware after Cookie
// Policy Middleware and before MVC Middleware.
// app.UseSession();
app.UseMvc();
}
}
UseCookiePolicy dipanggil dalam Startup.Configure
:
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services
// to the container.
public void ConfigureServices(IServiceCollection services)
{
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;
});
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddDefaultIdentity<IdentityUser>()
.AddEntityFrameworkStores<ApplicationDbContext>();
// If the app uses session state, call AddSession.
// services.AddSession();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
// This method gets called by the runtime. Use this method to configure the
// HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseAuthentication();
// If the app uses session state, call Session Middleware after Cookie
// Policy Middleware and before MVC Middleware.
// app.UseSession();
app.UseMvc();
}
}
tampilan parsial _CookieConsentPartial.cshtml
Tampilan parsial _CookieConsentPartial.cshtml :
@using Microsoft.AspNetCore.Http.Features
@{
var consentFeature = Context.Features.Get<ITrackingConsentFeature>();
var showBanner = !consentFeature?.CanTrack ?? false;
var cookieString = consentFeature?.CreateConsentCookie();
}
@if (showBanner)
{
<nav id="cookieConsent" class="navbar navbar-default navbar-fixed-top" role="alert">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#cookieConsent .navbar-collapse">
<span class="sr-only">Toggle cookie consent banner</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<span class="navbar-brand"><span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span></span>
</div>
<div class="collapse navbar-collapse">
<p class="navbar-text">
Use this space to summarize your privacy and cookie use policy.
</p>
<div class="navbar-right">
<a asp-page="/Privacy" class="btn btn-info navbar-btn">Learn More</a>
<button type="button" class="btn btn-default navbar-btn" data-cookie-string="@cookieString">Accept</button>
</div>
</div>
</div>
</nav>
<script>
(function () {
document.querySelector("#cookieConsent button[data-cookie-string]").addEventListener("click", function (el) {
document.cookie = el.target.dataset.cookieString;
document.querySelector("#cookieConsent").classList.add("hidden");
}, false);
})();
</script>
}
Parsial ini:
- Mendapatkan status pelacakan untuk pengguna. Jika aplikasi dikonfigurasi untuk memerlukan persetujuan, pengguna harus menyetujui sebelum cookie dapat dilacak. Jika persetujuan diperlukan, cookie panel persetujuan diperbaiki di bagian atas bilah navigasi yang dibuat oleh file _Layout.cshtml .
- Menyediakan elemen HTML
<p>
untuk meringkas kebijakan penggunaan dan cookie Andaprivacy. - Menyediakan tautan ke Privacy halaman atau tampilan tempat Anda dapat merinci kebijakan situs privacy Anda.
Cookie penting
Jika persetujuan untuk menyimpan cookie belum disediakan, hanya cookie yang ditandai penting yang dikirim ke browser. Kode berikut membuat hal penting cookie :
public IActionResult OnPostCreateEssentialAsync()
{
HttpContext.Response.Cookies.Append(Constants.EssentialSec,
DateTime.Now.Second.ToString(),
new CookieOptions() { IsEssential = true });
ResponseCookies = Response.Headers[HeaderNames.SetCookie].ToString();
return RedirectToPage("./Index");
}
Penyedia TempData dan cookie status sesi tidak penting
Penyedia TempDatacookie tidak penting. Jika pelacakan dinonaktifkan, penyedia TempData tidak berfungsi. Untuk mengaktifkan penyedia TempData saat pelacakan dinonaktifkan, tandai TempData cookie sebagai penting dalam Startup.ConfigureServices
:
// The TempData provider cookie is not essential. Make it essential
// so TempData is functional when tracking is disabled.
services.Configure<CookieTempDataProviderOptions>(options => {
options.Cookie.IsEssential = true;
});
Cookie status sesi tidak penting. Status sesi tidak berfungsi saat pelacakan dinonaktifkan. Kode berikut membuat cookie sesi penting:
services.AddSession(options =>
{
options.Cookie.IsEssential = true;
});
Data pribadi
ASP.NET aplikasi Core yang dibuat dengan akun pengguna individual menyertakan kode untuk mengunduh dan menghapus data pribadi.
Pilih nama pengguna lalu pilih Data pribadi:
Catatan:
- Untuk menghasilkan
Account/Manage
kode, lihat Perancah Identity. - Tautan Hapus dan Unduh hanya bertindak pada data defaultidentity. Aplikasi yang membuat data pengguna kustom harus diperluas untuk menghapus/mengunduh data pengguna kustom. Untuk informasi selengkapnya, lihat Menambahkan, mengunduh, dan menghapus data pengguna kustom ke Identity.
- Token tersimpan untuk pengguna yang disimpan dalam Identity tabel
AspNetUserTokens
database dihapus ketika pengguna dihapus melalui perilaku penghapusan berskala karena kunci asing. - Autentikasi penyedia eksternal, seperti Facebook dan Google, tidak tersedia sebelum cookie kebijakan diterima.
Enkripsi di rest
Beberapa database dan mekanisme penyimpanan memungkinkan enkripsi di rest. Enkripsi di rest:
- Mengenkripsi data yang disimpan secara otomatis.
- Mengenkripsi tanpa konfigurasi, pemrograman, atau pekerjaan lain untuk perangkat lunak yang mengakses data.
- Adalah opsi term mudah dan paling aman.
- Memungkinkan database mengelola kunci dan enkripsi.
Contohnya:
- Microsoft SQL dan Azure SQL menyediakan Transparent Data Encryption (TDE).
- SQL Azure mengenkripsi database secara default
- Azure Blobs, Files, Table, dan Queue Storage dienkripsi secara default.
Untuk database yang tidak menyediakan enkripsi bawaan di rest, Anda mungkin dapat menggunakan enkripsi disk untuk memberikan perlindungan yang sama. Contohnya:
Sumber Daya Tambahan:
- Templat proyek mencakup titik ekstensi dan markup terstubbed yang dapat Anda ganti dengan kebijakan penggunaan dan cookie Andaprivacy.
- Halaman
Pages/Privacy.cshtml
atauViews/Home/Privacy.cshtml
tampilan menyediakan halaman untuk merinci kebijakan situs privacy Anda.
Untuk mengaktifkan fitur persetujuan default cookie seperti yang ditemukan di templat ASP.NET Core 2.2 dalam aplikasi yang dihasilkan templat ASP.NET Core saat ini:
Tambahkan
using Microsoft.AspNetCore.Http
ke daftar menggunakan arahan.Tambahkan CookiePolicyOptions ke
Startup.ConfigureServices
dan UseCookiePolicy keStartup.Configure
:public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services) { services.Configure<CookiePolicyOptions>(options => { // This lambda determines whether user consent for non-essential // cookies is needed for a given request. options.CheckConsentNeeded = context => true; // requires using Microsoft.AspNetCore.Http; options.MinimumSameSitePolicy = SameSiteMode.None; }); services.AddRazorPages(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseCookiePolicy(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapRazorPages(); }); } }
cookie Tambahkan sebagian persetujuan ke
_Layout.cshtml
file:@*Previous markup removed for brevity*@ </header> <div class="container"> <partial name="_CookieConsentPartial" /> <main role="main" class="pb-3"> @RenderBody() </main> </div> <footer class="border-top footer text-muted"> <div class="container"> © 2019 - RPCC - <a asp-area="" asp-page="/Privacy">Privacy</a> </div> </footer> <script src="~/lib/jquery/dist/jquery.js"></script> <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.js"></script> <script src="~/js/site.js" asp-append-version="true"></script> @RenderSection("Scripts", required: false) </body> </html>
Tambahkan file _CookieConsentPartial.cshtml ke proyek:
@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> }
Pilih versi ASP.NET Core 2.2 dari artikel ini untuk membaca tentang cookie fitur persetujuan.
- Templat proyek mencakup titik ekstensi dan markup terstubbed yang dapat Anda ganti dengan kebijakan penggunaan dan cookie Andaprivacy.
- Halaman
Pages/Privacy.cshtml
atauViews/Home/Privacy.cshtml
tampilan menyediakan halaman untuk merinci kebijakan situs privacy Anda.
Untuk mengaktifkan fitur persetujuan default cookie seperti yang ditemukan di templat ASP.NET Core 2.2 dalam aplikasi yang dihasilkan templat ASP.NET Core saat ini, tambahkan kode yang disorot berikut ke Program.cs
:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.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;
});
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Dalam kode sebelumnya, CookiePolicyOptions dan UseCookiePolicy digunakan.
cookie Tambahkan sebagian persetujuan ke
_Layout.cshtml
file:@*Previous markup removed for brevity*@ </header> <div class="container"> <partial name="_CookieConsentPartial" /> <main role="main" class="pb-3"> @RenderBody() </main> </div> <footer class="border-top footer text-muted"> <div class="container"> © 2022 - WebGDPR - <a asp-area="" asp-page="/Privacy">Privacy</a> </div> </footer> <script src="~/lib/jquery/dist/jquery.min.js"></script> <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script> <script src="~/js/site.js" asp-append-version="true"></script> @await RenderSectionAsync("Scripts", required: false) </body> </html>
_CookieConsentPartial.cshtml
Tambahkan file ke proyek:@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-bs-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> }
Pilih versi ASP.NET Core 2.2 dari artikel ini untuk membaca tentang cookie fitur persetujuan.
Enkripsi di rest
Beberapa database dan mekanisme penyimpanan memungkinkan enkripsi di rest. Enkripsi di rest:
- Mengenkripsi data yang disimpan secara otomatis.
- Mengenkripsi tanpa konfigurasi, pemrograman, atau pekerjaan lain untuk perangkat lunak yang mengakses data.
- Adalah opsi term mudah dan paling aman.
- Memungkinkan database mengelola kunci dan enkripsi.
Contohnya:
- Microsoft SQL dan Azure SQL menyediakan Transparent Data Encryption (TDE).
- SQL Azure mengenkripsi database secara default
- Azure Blobs, Files, Table, dan Queue Storage dienkripsi secara default.
Untuk database yang tidak menyediakan enkripsi bawaan di rest, Anda mungkin dapat menggunakan enkripsi disk untuk memberikan perlindungan yang sama. Contohnya:
Sumber Daya Tambahan:
ASP.NET Core