ASP.NET Core'da AB Genel Veri Koruma Yönetmeliği (GDPR) desteği

Gönderen Rick Anderson

ASP.NET Core, AB Genel Veri Koruma Yönetmeliği (GDPR) gereksinimlerinin bazılarını karşılamaya yardımcı olacak API'ler ve şablonlar sağlar:

  • Proje şablonları, gizlilik ve kullanım ilkenizle değiştirebileceğiniz uzantı noktalarını ve cookie saplı işaretlemeyi içerir.
  • Sayfa Pages/Privacy.cshtml veya Views/Home/Privacy.cshtml görünüm, sitenizin gizlilik ilkesini ayrıntılı olarak görüntülemek için bir sayfa sağlar.

Geçerli ASP.NET Core şablonu tarafından oluşturulan bir uygulamada ASP.NET Core 2.2 şablonlarında bulunan gibi varsayılan cookie onay özelliğini etkinleştirmek için aşağıdaki vurgulanmış kodu öğesine Program.csekleyin:

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();

Önceki kodda CookiePolicyOptions ve UseCookiePolicy kullanılır.

  • Dosyaya cookie kısmi _Layout.cshtml onay ekleyin:

                @*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 Dosyayı projeye ekleyin:

    @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>
    }
    
  • Onay özelliği hakkında cookie bilgi edinmek için bu makalenin ASP.NET Core 2.2 sürümünü seçin.

Kullanıcının özelliğini kullanarak CookiePolicyOptions.ConsentCookieValue kullanım ilkesine onay verilip verirseniz izlemek için cookie kullanılan değeri belirtin:

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();

Bekleme sırasında şifreleme

Bazı veritabanları ve depolama mekanizmaları bekleme durumunda şifrelemeye olanak sağlar. Bekleyen şifreleme:

  • Depolanan verileri otomatik olarak şifreler.
  • Verilere erişen yazılım için yapılandırma, programlama veya başka bir çalışma olmadan şifreler.
  • En kolay ve en güvenli seçenektir.
  • Veritabanının anahtarları ve şifrelemeyi yönetmesine izin verir.

Örnek:

Bekleyen yerleşik şifreleme sağlamayan veritabanları için aynı korumayı sağlamak için disk şifrelemesi kullanabilirsiniz. Örnek:

Ek kaynaklar

  • Proje şablonları, gizlilik ve kullanım ilkenizle değiştirebileceğiniz uzantı noktalarını ve cookie saplı işaretlemeyi içerir.
  • Onay cookie özelliği, kullanıcılarınızdan kişisel bilgileri depolamak için onay istemenizi (ve izlemenizi) sağlar. Kullanıcı veri toplamayı onaylamadıysa ve uygulama olarak ayarlandıysa CheckConsentNeededtrue, temel cookieolmayan öğeler tarayıcıya gönderilmez.
  • Cookies temel olarak işaretlenebilir. Temel cookiebilgiler, kullanıcı onay vermediğinde ve izleme devre dışı bırakıldığında bile tarayıcıya gönderilir.
  • İzleme devre dışı bırakıldığında TempData ve Session cookie işlevleri çalışmaz.
  • Yönet Identity sayfasında kullanıcı verilerini indirmek ve silmek için bir bağlantı sağlanır.

Örnek uygulama, ASP.NET Core 2.1 şablonlarına eklenen GDPR uzantı noktalarının ve API'lerin çoğunu test etmenizi sağlar. Test yönergeleri için BeniOku dosyasına bakın.

Örnek kodu görüntüleme veya indirme (indirme)

Şablon tarafından oluşturulan kodda Temel GDPR desteği ASP.NET

Razor Proje şablonlarıyla oluşturulan sayfalar ve MVC projeleri aşağıdaki GDPR desteğini içerir:

  • CookiePolicyOptions ve UseCookiePolicy sınıfında ayarlanır Startup .
  • _ConsentPartial.cshtmlkısmi görünümüCookie. Bu dosyaya Bir Kabul Et düğmesi eklenmiştir. Kullanıcı Kabul Et düğmesine tıkladığında, depolamaya cookieonay verilir.
  • Sayfa Pages/Privacy.cshtml veya Views/Home/Privacy.cshtml görünüm, sitenizin gizlilik ilkesini ayrıntılı olarak görüntülemek için bir sayfa sağlar. _CookieConsentPartial.cshtml dosyası sayfaya Privacy bir bağlantı oluşturur.
  • Tek tek kullanıcı hesaplarıyla oluşturulan uygulamalar için Yönet sayfasında kişisel kullanıcı verilerini indirme ve silme bağlantıları sağlanır.

CookieİlkeSeçenekler ve KullanımCookieİlkesi

CookiePolicyOptions içinde Startup.ConfigureServicesbaşlatılır:

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 içinde çağrılır 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();
    }
}

_CookieConsentPartial.cshtml kısmi görünüm

_CookieConsentPartial.cshtml kısmi görünümü:

@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>
}

Bu kısmi:

  • Kullanıcı için izleme durumunu alır. Uygulama onay gerektirecek şekilde yapılandırılmışsa, kullanıcının izinlerin izlenebilmesi için önce cookieonay vermesi gerekir. Onay gerekiyorsa, cookie onay paneli _Layout.cshtml dosyası tarafından oluşturulan gezinti çubuğunun üst kısmında sabittir.
  • Gizlilik ve cookie kullanım ilkenizi özetlemek için bir HTML <p> öğesi sağlar.
  • Sitenizin Privacy gizlilik ilkesini ayrıntılandırabileceğiniz bir sayfa veya görünüm bağlantısı sağlar.

Temel cookies

Depolama cookieiçin onay verilmediyse, tarayıcıya yalnızca cookietemel olarak işaretlenmiş öğeler gönderilir. Aşağıdaki kod bir temel oluşturur 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");
}

TempData sağlayıcısı ve oturum durumu cookietemel değildir

TempData sağlayıcısıcookie gerekli değildir. İzleme devre dışı bırakılırsa TempData sağlayıcısı işlevsel değildir. İzleme devre dışı bırakıldığında TempData sağlayıcısını etkinleştirmek için, içinde TempData'yı cookieStartup.ConfigureServicestemel olarak işaretleyin:

// 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;
});

Oturum durumucookietemel değildir. İzleme devre dışı bırakıldığında oturum durumu çalışmıyor. Aşağıdaki kod, oturumun cookiegerekli olmasını sağlar:

services.AddSession(options =>
{
    options.Cookie.IsEssential = true;
});

Kişisel veriler

ASP.NET Bireysel kullanıcı hesaplarıyla oluşturulan Core uygulamaları, kişisel verileri indirmek ve silmek için kod içerir.

Kullanıcı adını ve ardından Kişisel veriler'i seçin:

Manage personal data page

Notlar:

  • Kodu oluşturmak Account/Manage için bkz . İskele Identity.
  • Sil ve İndir bağlantıları yalnızca varsayılan kimlik verileri üzerinde işlem gerçekleştirir. Özel kullanıcı verilerinin silinmesi/indirilmesi için özel kullanıcı verileri oluşturan uygulamaların genişletilmesi gerekir. Daha fazla bilgi için bkz . özel kullanıcı verilerini ekleme Identity, indirme ve silme.
  • Kullanıcı, yabancı anahtar nedeniyle art arda silme davranışıyla silindiğinde, veritabanı tablosunda AspNetUserTokens depolanan Identity kullanıcı için kaydedilen belirteçler silinir.
  • Facebook ve Google gibi dış sağlayıcı kimlik doğrulaması, ilke kabul etmeden önce cookie kullanılamaz.

Bekleme sırasında şifreleme

Bazı veritabanları ve depolama mekanizmaları bekleme durumunda şifrelemeye olanak sağlar. Bekleyen şifreleme:

  • Depolanan verileri otomatik olarak şifreler.
  • Verilere erişen yazılım için yapılandırma, programlama veya başka bir çalışma olmadan şifreler.
  • En kolay ve en güvenli seçenektir.
  • Veritabanının anahtarları ve şifrelemeyi yönetmesine izin verir.

Örnek:

Bekleyen yerleşik şifreleme sağlamayan veritabanları için aynı korumayı sağlamak için disk şifrelemesi kullanabilirsiniz. Örnek:

Ek kaynaklar

  • Proje şablonları, gizlilik ve kullanım ilkenizle değiştirebileceğiniz uzantı noktalarını ve cookie saplı işaretlemeyi içerir.
  • Sayfa Pages/Privacy.cshtml veya Views/Home/Privacy.cshtml görünüm, sitenizin gizlilik ilkesini ayrıntılı olarak görüntülemek için bir sayfa sağlar.

Geçerli ASP.NET Core şablonu tarafından oluşturulan bir uygulamadaki ASP.NET Core 2.2 şablonlarında bulunan gibi varsayılan cookie onay özelliğini etkinleştirmek için:

  • Kullanma yönergeleri listesine ekleyin using Microsoft.AspNetCore.Http .

  • ve UseCookiePolicy içine Startup.ConfigureServicesStartup.ConfigureekleyinCookiePolicyOptions:

    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();
            });
        }
    }
    
  • Dosyaya cookie kısmi _Layout.cshtml onay ekleyin:

            @*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>
    
    
  • _CookieConsentPartial.cshtml dosyasını projeye ekleyin:

    @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>
    }
    
  • Onay özelliği hakkında cookie bilgi edinmek için bu makalenin ASP.NET Core 2.2 sürümünü seçin.

  • Proje şablonları, gizlilik ve kullanım ilkenizle değiştirebileceğiniz uzantı noktalarını ve cookie saplı işaretlemeyi içerir.
  • Sayfa Pages/Privacy.cshtml veya Views/Home/Privacy.cshtml görünüm, sitenizin gizlilik ilkesini ayrıntılı olarak görüntülemek için bir sayfa sağlar.

Geçerli ASP.NET Core şablonu tarafından oluşturulan bir uygulamada ASP.NET Core 2.2 şablonlarında bulunan gibi varsayılan cookie onay özelliğini etkinleştirmek için aşağıdaki vurgulanmış kodu öğesine Program.csekleyin:

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();

Önceki kodda CookiePolicyOptions ve UseCookiePolicy kullanılır.

  • Dosyaya cookie kısmi _Layout.cshtml onay ekleyin:

                @*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 Dosyayı projeye ekleyin:

    @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>
    }
    
  • Onay özelliği hakkında cookie bilgi edinmek için bu makalenin ASP.NET Core 2.2 sürümünü seçin.

Bekleme sırasında şifreleme

Bazı veritabanları ve depolama mekanizmaları bekleme durumunda şifrelemeye olanak sağlar. Bekleyen şifreleme:

  • Depolanan verileri otomatik olarak şifreler.
  • Verilere erişen yazılım için yapılandırma, programlama veya başka bir çalışma olmadan şifreler.
  • En kolay ve en güvenli seçenektir.
  • Veritabanının anahtarları ve şifrelemeyi yönetmesine izin verir.

Örnek:

Bekleyen yerleşik şifreleme sağlamayan veritabanları için aynı korumayı sağlamak için disk şifrelemesi kullanabilirsiniz. Örnek:

Ek kaynaklar