Bagikan melalui


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 tersandung yang dapat Anda ganti dengan kebijakan privasi dan cookie penggunaan Anda.
  • Halaman Pages/Privacy.cshtml atau Views/Home/Privacy.cshtml tampilan menyediakan halaman untuk merinci kebijakan privasi situs 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">
                &copy; 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.

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 saat tidak aktif

Beberapa database dan mekanisme penyimpanan memungkinkan enkripsi tidak aktif. Enkripsi saat tidak aktif:

  • 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:

Untuk database yang tidak menyediakan enkripsi bawaan saat tidak aktif, Anda mungkin dapat menggunakan enkripsi disk untuk memberikan perlindungan yang sama. Contohnya:

Sumber Daya Tambahan:

  • Templat proyek mencakup titik ekstensi dan markup tersandung yang dapat Anda ganti dengan kebijakan privasi dan cookie penggunaan Anda.
  • 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, hal yang tidak penting cookietidak dikirim ke browser.
  • Cookies dapat ditandai sebagai penting. Esensial cookiedikirim ke browser bahkan ketika pengguna belum menyetujui dan pelacakan dinonaktifkan.
  • TempData dan Sesi cookie 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. Saat pengguna mengklik tombol Terima , persetujuan untuk menyimpan cookies disediakan.
  • Halaman Pages/Privacy.cshtml atau Views/Home/Privacy.cshtml tampilan menyediakan halaman untuk merinci kebijakan privasi situs 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.

CookieKebijakanOpsi dan Kebijakan PenggunaanCookie

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 cookiedapat 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 privasi dan cookie penggunaan Anda.
  • Menyediakan tautan ke Privacy halaman atau tampilan tempat Anda dapat merinci kebijakan privasi situs Anda.

Penting cookies

Jika persetujuan untuk menyimpan cookiebelum disediakan, hanya cookieyang 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 status cookiesesi 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;
});

cookieStatus sesi tidak penting. Status sesi tidak berfungsi saat pelacakan dinonaktifkan. Kode berikut membuat sesi cookiepenting:

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:

Manage personal data page

Catatan:

  • Untuk menghasilkan Account/Manage kode, lihat Perancah Identity.
  • Tautan Hapus dan Unduh hanya bertindak pada data identitas default. 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 saat tidak aktif

Beberapa database dan mekanisme penyimpanan memungkinkan enkripsi tidak aktif. Enkripsi saat tidak aktif:

  • 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:

Untuk database yang tidak menyediakan enkripsi bawaan saat tidak aktif, Anda mungkin dapat menggunakan enkripsi disk untuk memberikan perlindungan yang sama. Contohnya:

Sumber Daya Tambahan:

  • Templat proyek mencakup titik ekstensi dan markup tersandung yang dapat Anda ganti dengan kebijakan privasi dan cookie penggunaan Anda.
  • Halaman Pages/Privacy.cshtml atau Views/Home/Privacy.cshtml tampilan menyediakan halaman untuk merinci kebijakan privasi situs 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 ke Startup.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">
                &copy; 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 tersandung yang dapat Anda ganti dengan kebijakan privasi dan cookie penggunaan Anda.
  • Halaman Pages/Privacy.cshtml atau Views/Home/Privacy.cshtml tampilan menyediakan halaman untuk merinci kebijakan privasi situs 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">
                &copy; 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 saat tidak aktif

Beberapa database dan mekanisme penyimpanan memungkinkan enkripsi tidak aktif. Enkripsi saat tidak aktif:

  • 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:

Untuk database yang tidak menyediakan enkripsi bawaan saat tidak aktif, Anda mungkin dapat menggunakan enkripsi disk untuk memberikan perlindungan yang sama. Contohnya:

Sumber Daya Tambahan: