Wsparcie dla ogólnego rozporządzenia o ochronie danych (RODO) w ue w ASP.NET Core

Autor: Rick Anderson

ASP.NET Core udostępnia interfejsy API i szablony ułatwiające spełnienie niektórych wymagań dotyczących ogólnego rozporządzenia o ochronie danych (RODO):

  • Szablony projektów obejmują punkty rozszerzeń i stubbed markup, które można zastąpić zasadami ochrony prywatności i cookie używania.
  • Strona Pages/Privacy.cshtml lub Views/Home/Privacy.cshtml widok zawiera stronę zawierającą szczegółowe informacje na temat zasad zachowania poufności informacji w witrynie.

Aby włączyć domyślną cookie funkcję wyrażania zgody, na przykład znajdującą się w szablonach platformy ASP.NET Core 2.2 w bieżącym szablonie ASP.NET Core wygenerowanym przez aplikację, dodaj następujący wyróżniony kod do 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();

W poprzednim kodzie CookiePolicyOptions i UseCookiePolicy są używane.

  • cookie Dodaj wyrażenie zgody częściowe _Layout.cshtml do pliku:

                @*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 Dodaj plik 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>
    }
    
  • Wybierz wersję tego artykułu ASP.NET Core 2.2, aby przeczytać o funkcji wyrażania cookie zgody.

Określ wartość używaną do śledzenia, czy użytkownik wyraził zgodę na cookie korzystanie z zasad przy użyciu CookiePolicyOptions.ConsentCookieValue właściwości :

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

Szyfrowanie w spoczynku

Niektóre bazy danych i mechanizmy magazynowania umożliwiają szyfrowanie magazynowane. Szyfrowanie magazynowane:

  • Szyfruje przechowywane dane automatycznie.
  • Szyfruje bez konfiguracji, programowania lub innego oprogramowania, które uzyskuje dostęp do danych.
  • Jest najprostszą i najbezpieczniejszą opcją.
  • Umożliwia bazie danych zarządzanie kluczami i szyfrowaniem.

Przykład:

W przypadku baz danych, które nie zapewniają wbudowanego szyfrowania magazynowanych, może być możliwe użycie szyfrowania dysków w celu zapewnienia tej samej ochrony. Przykład:

Dodatkowe zasoby

  • Szablony projektów obejmują punkty rozszerzeń i stubbed markup, które można zastąpić zasadami ochrony prywatności i cookie używania.
  • Funkcja wyrażania cookie zgody umożliwia prośbę o zgodę (i śledzenie) od użytkowników w celu przechowywania danych osobowych. Jeśli użytkownik nie wyraził zgody na zbieranie danych, a aplikacja CheckConsentNeeded ma ustawioną wartość true, nie są cookiewysyłane do przeglądarki.
  • Cookies można oznaczyć jako niezbędne. Podstawowe cookieelementy są wysyłane do przeglądarki nawet wtedy, gdy użytkownik nie wyraził zgody i śledzenie jest wyłączone.
  • Pliki TempData i Session cookie nie działają, gdy śledzenie jest wyłączone.
  • Strona Identity zarządzania udostępnia link do pobierania i usuwania danych użytkownika.

Przykładowa aplikacja umożliwia przetestowanie większości punktów rozszerzeń RODO i interfejsów API dodanych do szablonów platformy ASP.NET Core 2.1. Aby uzyskać instrukcje dotyczące testowania , zobacz plik ReadMe .

Wyświetl lub pobierz przykładowy kod (jak pobrać)

obsługa ASP.NET Core RODO w kodzie wygenerowanym przez szablon

Razor Strony i projekty MVC utworzone za pomocą szablonów projektu obejmują następującą obsługę RODO:

  • CookiePolicyOptions i UseCookiePolicy są ustawiane w Startup klasie .
  • Widok częściowy _CookieConsentPartial.cshtml. W tym pliku znajduje się przycisk Akceptuj . Gdy użytkownik kliknie przycisk Akceptuj , zostanie udzielona zgoda na przechowywanie cookieplików.
  • Strona Pages/Privacy.cshtml lub Views/Home/Privacy.cshtml widok zawiera stronę zawierającą szczegółowe informacje na temat zasad zachowania poufności informacji w witrynie. Plik _CookieConsentPartial.cshtml generuje link do Privacy strony.
  • W przypadku aplikacji utworzonych przy użyciu indywidualnych kont użytkowników strona Zarządzanie zawiera linki do pobierania i usuwania danych użytkownika osobistego.

CookieZasadyOpcje i używanieCookiezasad

CookiePolicyOptions są inicjowane w pliku 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 jest wywoływana w pliku 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 — widok częściowy

Widok częściowy _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>
}

To częściowe:

  • Uzyskuje stan śledzenia dla użytkownika. Jeśli aplikacja jest skonfigurowana tak, aby wymagała zgody, użytkownik musi wyrazić zgodę, zanim cookiebędzie można śledzić te ustawienia. Jeśli jest wymagana zgoda, cookie panel zgody jest stały u góry paska nawigacyjnego utworzonego przez plik _Layout.cshtml .
  • Udostępnia element HTML <p> do podsumowania prywatności i cookie używania zasad.
  • Zawiera link do Privacy strony lub widoku, w którym można szczegółowo określić zasady ochrony prywatności witryny.

Podstawowe cookies

Jeśli nie podano zgody na przechowywanie cookie, do przeglądarki są wysyłane tylko cookieoznaczone istotne elementy. Poniższy kod ma cookie zasadnicze znaczenie:

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

Dostawca tempData i stan cookiesesji nie są niezbędne

Dostawca cookie TempData nie jest niezbędny. Jeśli śledzenie jest wyłączone, dostawca TempData nie działa. Aby włączyć dostawcę TempData podczas śledzenia jest wyłączona, oznacz wartość TempData cookie jako niezbędną w pliku 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;
});

Stanycookiesesji nie są niezbędne. Stan sesji nie działa, gdy śledzenie jest wyłączone. Poniższy kod sprawia, że sesja cookiejest niezbędna:

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

Dane osobiste

aplikacje ASP.NET Core utworzone przy użyciu poszczególnych kont użytkowników zawierają kod umożliwiający pobieranie i usuwanie danych osobowych.

Wybierz nazwę użytkownika, a następnie wybierz pozycję Dane osobowe:

Manage personal data page

Uwagi:

  • Aby wygenerować Account/Manage kod, zobacz Szkielet Identity.
  • Łącza Usuń i Pobierz działają tylko na domyślnych danych tożsamości. Aplikacje, które tworzą niestandardowe dane użytkownika, muszą zostać rozszerzone w celu usunięcia/pobrania niestandardowych danych użytkownika. Aby uzyskać więcej informacji, zobacz Dodawanie, pobieranie i usuwanie niestandardowych danych użytkownika do programu Identity.
  • Zapisane tokeny dla użytkownika przechowywanego w Identity tabeli AspNetUserTokens bazy danych są usuwane po usunięciu użytkownika za pośrednictwem kaskadowego zachowania usuwania z powodu klucza obcego.
  • Uwierzytelnianie dostawcy zewnętrznego, takie jak Facebook i Google, nie jest dostępne przed zaakceptowaniem cookie zasad.

Szyfrowanie w spoczynku

Niektóre bazy danych i mechanizmy magazynowania umożliwiają szyfrowanie magazynowane. Szyfrowanie magazynowane:

  • Szyfruje przechowywane dane automatycznie.
  • Szyfruje bez konfiguracji, programowania lub innego oprogramowania, które uzyskuje dostęp do danych.
  • Jest najprostszą i najbezpieczniejszą opcją.
  • Umożliwia bazie danych zarządzanie kluczami i szyfrowaniem.

Przykład:

W przypadku baz danych, które nie zapewniają wbudowanego szyfrowania magazynowanych, może być możliwe użycie szyfrowania dysków w celu zapewnienia tej samej ochrony. Przykład:

Dodatkowe zasoby

  • Szablony projektów obejmują punkty rozszerzeń i stubbed markup, które można zastąpić zasadami ochrony prywatności i cookie używania.
  • Strona Pages/Privacy.cshtml lub Views/Home/Privacy.cshtml widok zawiera stronę zawierającą szczegółowe informacje na temat zasad zachowania poufności informacji w witrynie.

Aby włączyć domyślną cookie funkcję wyrażania zgody, na przykład w szablonach platformy ASP.NET Core 2.2 w bieżącej aplikacji wygenerowanej ASP.NET Core:

  • Dodaj using Microsoft.AspNetCore.Http do listy dyrektyw using.

  • Dodaj CookiePolicyOptions do i UseCookiePolicy do Startup.ConfigureStartup.ConfigureServices :

    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 Dodaj wyrażenie zgody częściowe _Layout.cshtml do pliku:

            @*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>
    
    
  • Dodaj plik _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-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>
    }
    
  • Wybierz wersję tego artykułu ASP.NET Core 2.2, aby przeczytać o funkcji wyrażania cookie zgody.

  • Szablony projektów obejmują punkty rozszerzeń i stubbed markup, które można zastąpić zasadami ochrony prywatności i cookie używania.
  • Strona Pages/Privacy.cshtml lub Views/Home/Privacy.cshtml widok zawiera stronę zawierającą szczegółowe informacje na temat zasad zachowania poufności informacji w witrynie.

Aby włączyć domyślną cookie funkcję wyrażania zgody, na przykład znajdującą się w szablonach platformy ASP.NET Core 2.2 w bieżącym szablonie ASP.NET Core wygenerowanym przez aplikację, dodaj następujący wyróżniony kod do 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();

W poprzednim kodzie CookiePolicyOptions i UseCookiePolicy są używane.

  • cookie Dodaj wyrażenie zgody częściowe _Layout.cshtml do pliku:

                @*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 Dodaj plik 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>
    }
    
  • Wybierz wersję tego artykułu ASP.NET Core 2.2, aby przeczytać o funkcji wyrażania cookie zgody.

Szyfrowanie w spoczynku

Niektóre bazy danych i mechanizmy magazynowania umożliwiają szyfrowanie magazynowane. Szyfrowanie magazynowane:

  • Szyfruje przechowywane dane automatycznie.
  • Szyfruje bez konfiguracji, programowania lub innego oprogramowania, które uzyskuje dostęp do danych.
  • Jest najprostszą i najbezpieczniejszą opcją.
  • Umożliwia bazie danych zarządzanie kluczami i szyfrowaniem.

Przykład:

W przypadku baz danych, które nie zapewniają wbudowanego szyfrowania magazynowanych, może być możliwe użycie szyfrowania dysków w celu zapewnienia tej samej ochrony. Przykład:

Dodatkowe zasoby