Prise en charge de l’UE Règlement général sur la protection des données (RGPD) dans ASP.NET CoreEU General Data Protection Regulation (GDPR) support in ASP.NET Core

Par Rick AndersonBy Rick Anderson

ASP.NET Core fournit des API et des modèles pour vous aider à répondre à certaines exigences de l' ue Règlement général sur la protection des données (RGPD) :ASP.NET Core provides APIs and templates to help meet some of the EU General Data Protection Regulation (GDPR) requirements:

  • Les modèles de projet incluent des points d’extension et le balisage stub que vous pouvez remplacer par votre stratégie de confidentialité et d’utilisation des cookies.The project templates include extension points and stubbed markup that you can replace with your privacy and cookie use policy.
  • La page pages/privacy. cshtml ou vues/page d’affichage/privé/confidentialité. cshtml fournit une page pour détailler la politique de confidentialité de votre site.The Pages/Privacy.cshtml page or Views/Home/Privacy.cshtml view provides a page to detail your site's privacy policy.

Pour activer la fonctionnalité de consentement de cookie par défaut comme celle figurant dans les modèles ASP.NET Core 2,2 dans une application générée par le modèle 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:

  • Ajoutez using Microsoft.AspNetCore.Http à la liste des directives using.Add using Microsoft.AspNetCore.Http to the list of using directives.

  • Ajoutez CookiePolicyOptions à Startup.ConfigureServices et UseCookiePolicy à 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();
            });
        }
    }
    
  • Ajoutez le consentement de cookie partiel au fichier _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>
    
    
  • Ajoutez le fichier * _ CookieConsentPartial. cshtml* au projet :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>
    }
    
  • Sélectionnez la version ASP.NET Core 2,2 de cet article pour en savoir plus sur la fonctionnalité de consentement des cookies.Select the ASP.NET Core 2.2 version of this article to read about the cookie consent feature.

  • Les modèles de projet incluent des points d’extension et le balisage stub que vous pouvez remplacer par votre stratégie de confidentialité et d’utilisation des cookies.The project templates include extension points and stubbed markup that you can replace with your privacy and cookie use policy.
  • Une fonctionnalité de consentement de cookie vous permet de demander (et de suivre) le consentement de vos utilisateurs pour le stockage des informations personnelles.A cookie consent feature allows you to ask for (and track) consent from your users for storing personal information. Si un utilisateur n’a pas consenti à la collecte de données et que l’application a CheckConsentNeeded défini sur true , les cookies non essentiels ne sont pas envoyés au navigateur.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.
  • Les cookies peuvent être marqués comme étant essentiels.Cookies can be marked as essential. Les cookies essentiels sont envoyés au navigateur même lorsque l’utilisateur n’a pas donné son consentement et que le suivi est désactivé.Essential cookies are sent to the browser even when the user hasn't consented and tracking is disabled.
  • Les cookies TempData et de session ne sont pas fonctionnels lorsque le suivi est désactivé.TempData and Session cookies aren't functional when tracking is disabled.
  • La page Identity gérer fournit un lien permettant de télécharger et de supprimer des données utilisateur.The Identity manage page provides a link to download and delete user data.

L' exemple d’application vous permet de tester la plupart des points d’extension RGPD et des API ajoutés aux modèles 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. Consultez le fichier Lisez-moi pour obtenir des instructions de test.See the ReadMe file for testing instructions.

Afficher ou télécharger l’exemple de code (procédure de téléchargement)View or download sample code (how to download)

ASP.NET Core la prise en charge RGPD dans le code généré par modèleASP.NET Core GDPR support in template-generated code

RazorLes pages et les projets MVC créés avec les modèles de projet incluent la prise en charge RGPD suivante : Pages and MVC projects created with the project templates include the following GDPR support:

  • CookiePolicyOptions et UseCookiePolicy sont définis dans la Startup classe.CookiePolicyOptions and UseCookiePolicy are set in the Startup class.
  • Vue partielle * _ CookieConsentPartial. cshtml* .The _CookieConsentPartial.cshtml partial view. Un bouton accepter est inclus dans ce fichier.An Accept button is included in this file. Quand l’utilisateur clique sur le bouton accepter , le consentement de stocker les cookies est fourni.When the user clicks the Accept button, consent to store cookies is provided.
  • La page pages/privacy. cshtml ou vues/page d’affichage/privé/confidentialité. cshtml fournit une page pour détailler la politique de confidentialité de votre site.The Pages/Privacy.cshtml page or Views/Home/Privacy.cshtml view provides a page to detail your site's privacy policy. Le fichier * _ CookieConsentPartial. cshtml* génère un lien vers la page de confidentialité.The _CookieConsentPartial.cshtml file generates a link to the Privacy page.
  • Pour les applications créées avec des comptes d’utilisateur individuels, la page gérer fournit des liens permettant de télécharger et de supprimer des données utilisateur personnelles.For apps created with individual user accounts, the Manage page provides links to download and delete personal user data.

CookiePolicyOptions et UseCookiePolicyCookiePolicyOptions and UseCookiePolicy

Les CookiePolicyOptions sont initialisés dans Startup.ConfigureServices :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 est appelé dans 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();
    }
}

_Vue partielle de CookieConsentPartial. cshtml_CookieConsentPartial.cshtml partial view

Vue partielle * _ 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>
}

Voici ce qui est partiel :This partial:

  • Obtient l’état de suivi de l’utilisateur.Obtains the state of tracking for the user. Si l’application est configurée pour exiger un consentement, l’utilisateur doit donner son consentement avant de pouvoir effectuer le suivi des cookies.If the app is configured to require consent, the user must consent before cookies can be tracked. Si le consentement est requis, le volet de consentement du cookie est corrigé en haut de la barre de navigation créée par le fichier * _ Layout. cshtml* .If consent is required, the cookie consent panel is fixed at top of the navigation bar created by the _Layout.cshtml file.
  • Fournit un <p> élément HTML pour résumer votre stratégie de confidentialité et d’utilisation des cookies.Provides an HTML <p> element to summarize your privacy and cookie use policy.
  • Fournit un lien vers la page de confidentialité ou une vue qui vous permet de détailler la politique de confidentialité de votre site.Provides a link to Privacy page or view where you can detail your site's privacy policy.

Cookies essentielsEssential cookies

Si le consentement de stocker des cookies n’a pas été fourni, seuls les cookies marqués comme essentiels sont envoyés au navigateur.If consent to store cookies hasn't been provided, only cookies marked essential are sent to the browser. Le code suivant rend un cookie essentiel :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");
}

Les cookies du fournisseur TempData et de l’état de session ne sont pas essentielsTempData provider and session state cookies aren't essential

Le cookie du fournisseur TempData n’est pas essentiel.The TempData provider cookie isn't essential. Si le suivi est désactivé, le fournisseur TempData n’est pas fonctionnel.If tracking is disabled, the TempData provider isn't functional. Pour activer le fournisseur TempData lorsque le suivi est désactivé, marquez le cookie TempData comme essentiel dans Startup.ConfigureServices :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;
});

Les cookies d' État de session ne sont pas essentiels.Session state cookies are not essential. L’état de session n’est pas fonctionnel lorsque le suivi est désactivé.Session state isn't functional when tracking is disabled. Le code suivant rend les cookies de session essentiels :The following code makes session cookies essential:

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

Données à caractère personnelPersonal data

ASP.NET Core applications créées avec des comptes d’utilisateur individuels incluent du code pour télécharger et supprimer des données personnelles.ASP.NET Core apps created with individual user accounts include code to download and delete personal data.

Sélectionnez le nom d’utilisateur, puis sélectionnez données personnelles:Select the user name and then select Personal data:

Page gérer les données personnelles

Remarques :Notes:

  • Pour générer le Account/Manage code, consultez structure Identity .To generate the Account/Manage code, see Scaffold Identity.
  • Les liens Delete et Download agissent uniquement sur les données d’identité par défaut.The Delete and Download links only act on the default identity data. Les applications qui créent des données utilisateur personnalisées doivent être étendues pour supprimer/télécharger les données utilisateur personnalisées.Apps that create custom user data must be extended to delete/download the custom user data. Pour plus d’informations, consultez Ajouter, télécharger et supprimer des données utilisateur personnalisées dans Identity .For more information, see Add, download, and delete custom user data to Identity.
  • Les jetons enregistrés pour l’utilisateur qui sont stockés dans la Identity table de base de données AspNetUserTokens sont supprimés lorsque l’utilisateur est supprimé par le biais du comportement de suppression en cascade en raison de la clé étrangère.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' authentification du fournisseur externe, telle que Facebook et Google, n’est pas disponible avant que la stratégie de cookie soit acceptée.External provider authentication, such as Facebook and Google, isn't available before the cookie policy is accepted.

Chiffrement au reposEncryption at rest

Certaines bases de données et mécanismes de stockage permettent le chiffrement au repos.Some databases and storage mechanisms allow for encryption at rest. Chiffrement au repos :Encryption at rest:

  • Chiffre automatiquement les données stockées.Encrypts stored data automatically.
  • Chiffre sans configuration, programmation ou autre travail pour le logiciel qui accède aux données.Encrypts without configuration, programming, or other work for the software that accesses the data.
  • Est l’option la plus simple et la plus sûre.Is the easiest and safest option.
  • Permet à la base de données de gérer les clés et le chiffrement.Allows the database to manage keys and encryption.

Par exemple :For example:

Pour les bases de données qui ne fournissent pas de chiffrement intégré au repos, vous pouvez utiliser le chiffrement de disque pour offrir la même protection.For databases that don't provide built-in encryption at rest, you may be able to use disk encryption to provide the same protection. Par exemple :For example:

Ressources supplémentairesAdditional resources