Podpora obecného nařízení EU o ochraně osobních údajů (GDPR) v ASP.NET Core

Rick Anderson

ASP.NET Core poskytuje rozhraní API a šablony, které pomáhají splnit některé požadavky obecného nařízení EU o ochraně osobních údajů (GDPR ):

  • Šablony projektů zahrnují body rozšíření a předpřipravené značky, které lze nahradit vašimi zásadami ochrany osobních údajů a zásadami použití cookie.
  • Stránka Pages/Privacy.cshtml nebo zobrazení Views/Home/Privacy.cshtml poskytuje stránku s podrobnostmi o zásadách ochrany osobních údajů vašeho webu.

Pokyny gdpr, které platí pro Blazor aplikace, najdete v tématu podpora obecného nařízení EU o ochraně osobních údajů (GDPR) v ASP.NET core Blazor.

Pokud chcete povolit výchozí cookie funkci vyjádření souhlasu, která se nachází v šablonách ASP.NET Core 2.2 v aktuální vygenerované šabloně ASP.NET Core, přidejte následující zvýrazněný kód: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();

V předchozím kódu se používají CookiePolicyOptions a UseCookiePolicy.

  • cookie Přidejte do _Layout.cshtml souboru consent partial:

                @*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>
    
  • Přidejte soubor _CookieConsentPartial.cshtml do projektu:

    @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>
    }
    
  • Vyberte verzi ASP.NET Core 2.2 tohoto článku a přečtěte si informace o funkci souhlasu cookie.

Zadejte hodnotu používanou ke sledování, zda uživatel udělil souhlas se zásadami používání cookie pomocí vlastnosti CookiePolicyOptions.ConsentCookieValue:

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

Šifrování neaktivních uložených dat

Některé databáze a mechanismy úložiště umožňují šifrování neaktivních uložených dat. Šifrování neaktivních uložených dat:

  • Šifruje uložená data automaticky.
  • Šifruje bez konfigurace, programování nebo jiné práce pro software, který přistupuje k datům.
  • Je nejjednodušší a nejbezpečnější volbou.
  • Umožňuje databázi spravovat klíče a šifrování.

Například:

U databází, které nezadají integrované šifrování neaktivních uložených dat, můžete k zajištění stejné ochrany použít šifrování disku. Například:

  • Šablony projektů zahrnují body rozšíření a předpřipravené značky, které lze nahradit vašimi zásadami ochrany osobních údajů a zásadami použití cookie.
  • Funkce cookie pro správu souhlasu umožňuje požádat uživatele o souhlas s ukládáním osobních údajů (a tento souhlas sledovat). Pokud uživatel neudělil souhlas se shromažďováním dat a aplikace je nastavená CheckConsentNeeded na true, neposílají se do prohlížeče jiné než nezbytné soubory cookie.
  • Cookies lze označit jako zásadní. Základní soubory cookie se posílají do prohlížeče, i když uživatel neschyboval souhlas a sledování je zakázané.
  • Cookies TempData a Session nefungují, pokud je zakázáno sledování.
  • Stránka Identity správa obsahuje odkaz ke stažení a odstranění uživatelských dat.

Ukázková aplikace umožňuje otestovat většinu bodů rozšíření GDPR a rozhraní API přidaných do šablon ASP.NET Core 2.1. Pokyny k testování najdete v souboru ReadMe .

Zobrazit nebo stáhnout ukázkový kód (postup stažení)

Podpora ASP.NET Core GDPR v kódu vygenerovaném ze šablony

Razor Stránky a projekty MVC vytvořené pomocí šablon projektů zahrnují následující podporu GDPR:

  • CookiePolicyOptions a UseCookiePolicy jsou nastaveny ve třídě Startup
  • _CookieConsentPartial.cshtmldílčí zobrazení. Do tohoto souboru je zahrnuto tlačítko Přijmout. Když uživatel klikne na tlačítko Přijmout, udělí souhlas s ukládáním souborů cookie.
  • Stránka Pages/Privacy.cshtml nebo zobrazení Views/Home/Privacy.cshtml poskytuje stránku s podrobnostmi o zásadách ochrany osobních údajů vašeho webu. Soubor _CookieConsentPartial.cshtml vygeneruje odkaz na Privacy stránku.
  • U aplikací vytvořených s použitím individuálních uživatelských účtů poskytuje stránka Správa odkazy ke stažení a odstranění osobních údajů uživatele.

CookiePolicyOptions a UseCookiePolicy

CookiePolicyOptions jsou inicializovány v 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 je volána z 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();
    }
}

Dílčí zobrazení _CookieConsentPartial.cshtml

_CookieConsentPartial.cshtml dílčí zobrazení:

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

Tato část:

  • Získá stav sledování uživatele. Pokud je aplikace nakonfigurovaná tak, aby vyžadovala souhlas, musí uživatel před sledováním souborů cookie souhlasit. Pokud je vyžadován souhlas, cookie panel pro vyjádření souhlasu je umístěn v horní části navigačního panelu vytvořeného souborem _Layout.cshtml.
  • Poskytuje HTML prvek <p> pro shrnutí zásad o ochraně osobních údajů a cookie politiky použití.
  • Obsahuje odkaz na Privacy stránku nebo zobrazení, kde můžete podrobně popsat zásady ochrany osobních údajů vašeho webu.

Nezbytné soubory cookie

Pokud nebyl poskytnut souhlas s ukládáním souborů cookie, odešlou se do prohlížeče jenom soubory cookie označené jako nezbytné. Následující kód činí cookie nezbytným:

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

Poskytovatel tempData a soubory cookie stavu relace nejsou nezbytné.

Poskytovatelcookie TempData není nezbytný. Pokud je sledování zakázané, poskytovatel TempData není funkční. Pokud chcete povolit zprostředkovatele TempData, když je sledování zakázáno, označte TempData cookie jako základní v 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;
});

Soubory cookie relace nejsou nezbytné. Stav relace není funkční, pokud je sledování zakázané. Následující kód dělá soubory cookie relace nezbytné:

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

Osobní údaje

ASP.NET Core aplikace vytvořené s individuálními uživatelskými účty obsahují kód pro stahování a odstraňování osobních údajů.

Vyberte uživatelské jméno a pak vyberte Osobní údaje:

Stránka Spravovat osobní údaje

Notes:

Šifrování neaktivních uložených dat

Některé databáze a mechanismy úložiště umožňují šifrování neaktivních uložených dat. Šifrování neaktivních uložených dat:

  • Šifruje uložená data automaticky.
  • Šifruje bez konfigurace, programování nebo jiné práce v softwaru, který přistupuje k datům.
  • Je nejjednodušší a nejbezpečnější volbou.
  • Umožňuje databázi spravovat klíče a šifrování.

Například:

U databází, které nezadají integrované šifrování neaktivních uložených dat, můžete k zajištění stejné ochrany použít šifrování disku. Například:

  • Šablony projektů zahrnují body rozšíření a předpřipravené značky, které lze nahradit vašimi zásadami ochrany osobních údajů a zásadami použití cookie.
  • Stránka Pages/Privacy.cshtml nebo zobrazení Views/Home/Privacy.cshtml poskytuje stránku s podrobnostmi o zásadách ochrany osobních údajů vašeho webu.

Pokud chcete povolit výchozí cookie funkci vyjádření souhlasu, podobně jako ta, která se nachází v šablonách ASP.NET Core 2.2, v aktuální aplikaci vygenerované šablonou ASP.NET Core:

  • Přidejte using Microsoft.AspNetCore.Http do seznamu direktiv použití.

  • Přidejte CookiePolicyOptions do Startup.ConfigureServices a UseCookiePolicy do 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 Přidejte partial consent do souboru _Layout.cshtml:

            @*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>
    
    
  • Přidejte do projektu soubor _CookieConsentPartial.cshtml:

    @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>
    }
    
  • Vyberte verzi tohoto článku ASP.NET Core 2.2 a přečtěte si informace o funkci souhlasu cookie .

  • Šablony projektů zahrnují body rozšíření a předpřipravené značky, které lze nahradit vašimi zásadami ochrany osobních údajů a zásadami použití cookie.
  • Stránka Pages/Privacy.cshtml nebo zobrazení Views/Home/Privacy.cshtml poskytuje stránku s podrobnostmi o zásadách ochrany osobních údajů vašeho webu.

Chcete-li povolit výchozí funkci vyjádření souhlasu cookie takovou, jaká se nachází v šablonách ASP.NET Core 2.2, v aplikaci vygenerované z aktuální šablony ASP.NET Core přidejte do Program.cs následující zvýrazněný kód:

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

V předchozím kódu se používají CookiePolicyOptions a UseCookiePolicy.

  • cookie Přidejte do _Layout.cshtml souboru consent partial:

                @*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 Přidejte soubor do projektu:

    @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>
    }
    
  • Vyberte verzi tohoto článku ASP.NET Core 2.2 a přečtěte si informace o funkci souhlasu cookie .

Šifrování neaktivních uložených dat

Některé databáze a mechanismy úložiště umožňují šifrování neaktivních uložených dat. Šifrování neaktivních uložených dat:

  • Automaticky šifruje uložená data.
  • Šifruje bez nutnosti konfigurace, programování nebo dalších úprav softwaru, který přistupuje k datům.
  • Je to nejjednodušší a nejbezpečnější možnost.
  • Umožňuje databázi spravovat klíče a šifrování.

Například:

U databází, které nezadají integrované šifrování neaktivních uložených dat, můžete k zajištění stejné ochrany použít šifrování disku. Například: