Udostępnij za pośrednictwem


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 znaczniki, które można zastąpić zasadami privacy i cookie używać.
  • Strona Pages/Privacy.cshtml lub Views/Home/Privacy.cshtml widok zawiera stronę zawierającą szczegółowe informacje o privacy zasadach witryny.

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 pod adresem rest

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

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

Na przykład:

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

Dodatkowe zasoby

  • Szablony projektów obejmują punkty rozszerzeń i stubbed znaczniki, które można zastąpić zasadami privacy i cookie używać.
  • 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, pliki cookie inne niż podstawowe nie są wysyłane do przeglądarki.
  • Pliki cookie mogą być oznaczone jako niezbędne. Podstawowe pliki cookie są wysyłane do przeglądarki nawet wtedy, gdy użytkownik nie wyraził zgody i śledzenie jest wyłączone.
  • Pliki cookie tempData i session 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 udostępniona zgoda na przechowywanie plików cookie.
  • Strona Pages/Privacy.cshtml lub Views/Home/Privacy.cshtml widok zawiera stronę zawierającą szczegółowe informacje o privacy zasadach witryny. 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.

CookiePolicyOptions i UseCookiePolicy

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

widok częściowy _CookieConsentPartial.cshtml

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 do wymagania zgody, użytkownik musi wyrazić zgodę, aby można było śledzić pliki cookie. 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 zasad privacy i cookie korzystania z nich.
  • Zawiera link do Privacy strony lub widoku, w którym można szczegółowo określić zasady witryny privacy .

Podstawowe pliki cookie

Jeśli nie podano zgody na przechowywanie plików cookie, do przeglądarki są wysyłane tylko pliki cookie oznaczone jako istotne. 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");
}

Pliki cookie stanu sesji i dostawcy tempData 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;
});

Pliki cookie stanu sesji nie są niezbędne. Stan sesji nie działa, gdy śledzenie jest wyłączone. Poniższy kod sprawia, że pliki cookie sesji są niezbędne:

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:

Strona Zarządzanie danymi osobowymi

Uwagi:

  • Aby wygenerować Account/Manage kod, zobacz Szkielet Identity.
  • Łącza Usuń i Pobierz działają tylko na danych domyślnych identity . 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 pod adresem rest

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

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

Na przykład:

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

Dodatkowe zasoby

  • Szablony projektów obejmują punkty rozszerzeń i stubbed znaczniki, które można zastąpić zasadami privacy i cookie używać.
  • Strona Pages/Privacy.cshtml lub Views/Home/Privacy.cshtml widok zawiera stronę zawierającą szczegółowe informacje o privacy zasadach witryny.

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 znaczniki, które można zastąpić zasadami privacy i cookie używać.
  • Strona Pages/Privacy.cshtml lub Views/Home/Privacy.cshtml widok zawiera stronę zawierającą szczegółowe informacje o privacy zasadach witryny.

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 pod adresem rest

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

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

Na przykład:

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

Dodatkowe zasoby