Supporto per Regolamento generale sulla protezione dei dati UE (GDPR) in ASP.NET CoreEU General Data Protection Regulation (GDPR) support in ASP.NET Core

Autore: Rick AndersonBy Rick Anderson

ASP.NET Core fornisce API e modelli per aiutare a soddisfare alcuni dei requisiti di regolamento generale sulla protezione dei dati UE (GDPR) :ASP.NET Core provides APIs and templates to help meet some of the EU General Data Protection Regulation (GDPR) requirements:

  • I modelli di progetto includono punti di estensione e markup con stub che è possibile sostituire con i criteri di uso della privacy e dei cookie.The project templates include extension points and stubbed markup that you can replace with your privacy and cookie use policy.
  • La pagina pages/privacy. cshtml o views/Home/Privacy. cshtml Visualizza una pagina che illustra in dettaglio l'informativa sulla privacy del sito.The Pages/Privacy.cshtml page or Views/Home/Privacy.cshtml view provides a page to detail your site's privacy policy.

Per abilitare la funzionalità di consenso dei cookie predefinita come quella disponibile nei modelli ASP.NET Core 2,2 in un'app generata da un modello ASP.NET Core 3,0:To enable the default cookie consent feature like that found in the ASP.NET Core 2.2 templates in an ASP.NET Core 3.0 template generated app:

  • Aggiungere using Microsoft.AspNetCore.Http all'elenco delle direttive using.Add using Microsoft.AspNetCore.Http to the list of using directives.

  • Aggiungere CookiePolicyOptions a Startup.ConfigureServices e UseCookiePolicy a Startup.Configure:Add CookiePolicyOptions to Startup.ConfigureServices and UseCookiePolicy to 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();
            });
        }
    }
    
  • Aggiungere il consenso del cookie parziale al file _Layout. cshtml :Add the cookie consent partial to the _Layout.cshtml file:

            @*Previous markup removed for brevity*@
        </header>
        <div class="container">
            <partial name="_CookieConsentPartial" />
            <main role="main" class="pb-3">
                @RenderBody()
            </main>
        </div>
    
        <footer class="border-top footer text-muted">
            <div class="container">
                &copy; 2019 - RPCC - <a asp-area="" asp-page="/Privacy">Privacy</a>
            </div>
        </footer>
    
        <script src="~/lib/jquery/dist/jquery.js"></script>
        <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.js"></script>
        <script src="~/js/site.js" asp-append-version="true"></script>
    
        @RenderSection("Scripts", required: false)
    </body>
    </html>
    
    
  • Aggiungere il * _file CookieConsentPartial. cshtml* al progetto:Add the _CookieConsentPartial.cshtml file to the project:

    @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>
    }
    
  • Selezionare la versione di ASP.NET Core 2,2 di questo articolo per informazioni sulla funzionalità di consenso dei cookie.Select the ASP.NET Core 2.2 version of this article to read about the cookie consent feature.

  • I modelli di progetto includono punti di estensione e markup con stub che è possibile sostituire con i criteri di uso della privacy e dei cookie.The project templates include extension points and stubbed markup that you can replace with your privacy and cookie use policy.
  • Una funzionalità di consenso dei cookie consente di richiedere (e tenere traccia) il consenso degli utenti per l'archiviazione di informazioni personali.A cookie consent feature allows you to ask for (and track) consent from your users for storing personal information. Se un utente non ha acconsentito alla raccolta dei dati e l'app CheckConsentNeeded è impostata su trueCheckConsentNeeded, i cookie non essenziali non vengono inviati al browser.If a user hasn't consented to data collection and the app has CheckConsentNeeded set to true, non-essential cookies aren't sent to the browser.
  • I cookie possono essere contrassegnati come essenziali.Cookies can be marked as essential. I cookie essenziali vengono inviati al browser anche quando l'utente non ha acconsentito e la verifica è disabilitata.Essential cookies are sent to the browser even when the user hasn't consented and tracking is disabled.
  • TempData e cookie di sessione non sono funzionali quando il rilevamento è disabilitato.TempData and Session cookies aren't functional when tracking is disabled.
  • La pagina Gestione identità fornisce un collegamento per scaricare ed eliminare i dati utente.The Identity manage page provides a link to download and delete user data.

L' app di esempio consente di testare la maggior parte delle API e dei punti di estensione GDPR aggiunti ai modelli ASP.NET Core 2,1.The sample app allows you test most of the GDPR extension points and APIs added to the ASP.NET Core 2.1 templates. Per le istruzioni di test, vedere il file Leggimi .See the ReadMe file for testing instructions.

Visualizzare o scaricare il codice di esempio (procedura per il download)View or download sample code (how to download)

Supporto di ASP.NET Core GDPR nel codice generato dal modelloASP.NET Core GDPR support in template-generated code

I progetti Razor Pages e MVC creati con i modelli di progetto includono il supporto GDPR seguente:Razor Pages and MVC projects created with the project templates include the following GDPR support:

  • CookiePolicyOptions e UseCookiePolicy vengono impostati nella Startup classe.CookiePolicyOptions and UseCookiePolicy are set in the Startup class.
  • Visualizzazione parziale * _CookieConsentPartial. cshtml* .The _CookieConsentPartial.cshtml partial view. In questo file è incluso un pulsante Accept .An Accept button is included in this file. Quando l'utente fa clic sul pulsante Accept , viene fornito il consenso per l'archiviazione dei cookie.When the user clicks the Accept button, consent to store cookies is provided.
  • La pagina pages/privacy. cshtml o views/Home/Privacy. cshtml Visualizza una pagina che illustra in dettaglio l'informativa sulla privacy del sito.The Pages/Privacy.cshtml page or Views/Home/Privacy.cshtml view provides a page to detail your site's privacy policy. Il * _file CookieConsentPartial. cshtml* genera un collegamento alla pagina privacy.The _CookieConsentPartial.cshtml file generates a link to the Privacy page.
  • Per le app create con singoli account utente, la pagina Gestisci fornisce collegamenti per scaricare ed eliminare i dati utente personali.For apps created with individual user accounts, the Manage page provides links to download and delete personal user data.

CookiePolicyOptions e UseCookiePolicyCookiePolicyOptions and UseCookiePolicy

CookiePolicyOptions vengono inizializzati Startup.ConfigureServicesin:CookiePolicyOptions are initialized in 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 viene chiamato in Startup.Configure:UseCookiePolicy is called in 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();
    }
}

_Visualizzazione parziale CookieConsentPartial. cshtml_CookieConsentPartial.cshtml partial view

Visualizzazione parziale * _CookieConsentPartial. cshtml* :The _CookieConsentPartial.cshtml partial view:

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

Questa parte parziale:This partial:

  • Ottiene lo stato di rilevamento per l'utente.Obtains the state of tracking for the user. Se l'app è configurata in modo da richiedere il consenso, l'utente deve fornire il consenso prima di poter tenere traccia dei cookie.If the app is configured to require consent, the user must consent before cookies can be tracked. Se è necessario il consenso, il pannello di consenso del cookie viene fissato nella parte superiore della barra di spostamento creata dal file * _layout. cshtml* .If consent is required, the cookie consent panel is fixed at top of the navigation bar created by the _Layout.cshtml file.
  • Fornisce un elemento <p> HTML per riepilogare i criteri di utilizzo della privacy e dei cookie.Provides an HTML <p> element to summarize your privacy and cookie use policy.
  • Fornisce un collegamento alla pagina privacy o alla visualizzazione in cui è possibile visualizzare i dettagli dell'informativa sulla privacy del sito.Provides a link to Privacy page or view where you can detail your site's privacy policy.

Cookie essenzialiEssential cookies

Se non è stato fornito il consenso per l'archiviazione dei cookie, verranno inviati al browser solo i cookie contrassegnati come essenziali.If consent to store cookies hasn't been provided, only cookies marked essential are sent to the browser. Il codice seguente rende un cookie essenziale:The following code makes a cookie essential:

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

I cookie di stato della sessione e del provider TempData non sono essenzialiTempData provider and session state cookies aren't essential

Il cookie del provider TempData non è essenziale.The TempData provider cookie isn't essential. Se il rilevamento è disabilitato, il provider TempData non funziona.If tracking is disabled, the TempData provider isn't functional. Per abilitare il provider TempData quando il rilevamento è disabilitato, contrassegnare il cookie TempData Startup.ConfigureServicescome essenziale in:To enable the TempData provider when tracking is disabled, mark the TempData cookie as essential in 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;
});

I cookie di stato della sessione non sono essenziali.Session state cookies are not essential. Lo stato della sessione non è funzionante quando il rilevamento è disabilitato.Session state isn't functional when tracking is disabled. Il codice seguente rende essenziali i cookie di sessione:The following code makes session cookies essential:

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

Dati personaliPersonal data

ASP.NET Core app create con account utente singoli includono il codice per scaricare ed eliminare i dati personali.ASP.NET Core apps created with individual user accounts include code to download and delete personal data.

Selezionare il nome utente e quindi selezionare dati personali:Select the user name and then select Personal data:

Pagina Gestisci dati personali

Note:Notes:

  • Per generare il Account/Manage codice, vedere impalcatura Identity.To generate the Account/Manage code, see Scaffold Identity.
  • I collegamenti Delete e download agiscono solo sui dati di identità predefiniti.The Delete and Download links only act on the default identity data. È necessario estendere le app che creano dati utente personalizzati per eliminare o scaricare i dati utente personalizzati.Apps that create custom user data must be extended to delete/download the custom user data. Per altre informazioni, vedere aggiungere, scaricare ed eliminare dati utente personalizzati in identità.For more information, see Add, download, and delete custom user data to Identity.
  • I token salvati per l'utente archiviati nella tabella AspNetUserTokens del database di identità vengono eliminati quando l'utente viene eliminato tramite il comportamento di eliminazione a cascata a causa della chiave esterna.Saved tokens for the user that are stored in the Identity database table AspNetUserTokens are deleted when the user is deleted via the cascading delete behavior due to the foreign key.
  • L' autenticazione del provider esterno, ad esempio Facebook e Google, non è disponibile prima che i criteri dei cookie vengano accettati.External provider authentication, such as Facebook and Google, isn't available before the cookie policy is accepted.

Crittografia di dati inattiviEncryption at rest

Alcuni database e meccanismi di archiviazione consentono la crittografia dei dati inattivi.Some databases and storage mechanisms allow for encryption at rest. Crittografia di dati inattivi:Encryption at rest:

  • Crittografa automaticamente i dati archiviati.Encrypts stored data automatically.
  • Crittografa senza configurazione, programmazione o altro lavoro per il software che accede ai dati.Encrypts without configuration, programming, or other work for the software that accesses the data.
  • È l'opzione più semplice e sicura.Is the easiest and safest option.
  • Consente al database di gestire le chiavi e la crittografia.Allows the database to manage keys and encryption.

Ad esempio:For example:

Per i database che non forniscono la crittografia incorporata, è possibile usare la crittografia del disco per fornire la stessa protezione.For databases that don't provide built-in encryption at rest, you may be able to use disk encryption to provide the same protection. Ad esempio:For example:

Risorse aggiuntiveAdditional resources