Prise en charge de l’Union européenne général Protection des données règlement (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 répondre à certaines de la règlement de Protection générale données (RGPD) d’Europe exigences :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 de stub balisage que vous pouvez remplacer votre stratégie d’utilisation de cookies et de confidentialité.The project templates include extension points and stubbed markup that you can replace with your privacy and cookie use policy.
  • Le Pages/Privacy.cshtml page ou Views/Home/Privacy.cshtml vue fournit une page qui décrit en détail 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 celui trouvé dans les modèles ASP.NET Core 2.2 dans une application de modèle générée d’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:

  • Ajouter CookiePolicyOptions trop Startup.ConfigureServices et UseCookiePolicy à Startup.Configure:Add CookiePolicyOptions too 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();
            });
        }
    }
    
  • Ajouter le partielle de consentement de cookie pour le _Layout.cshtml fichier :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>
    
    
  • Ajouter le _CookieConsentPartial.cshtml fichier 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 d’ASP.NET Core 2.2 de cet article pour en savoir plus sur la fonctionnalité de consentement du cookie.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 de stub balisage que vous pouvez remplacer votre stratégie d’utilisation de cookies et de confidentialité.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 demandera (et le suivi) consentement à partir 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 de l’application a CheckConsentNeeded défini sur true, les cookies non essentielles 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 essentielles.Cookies can be marked as essential. Les cookies essentielles sont envoyés au navigateur même lorsque l’utilisateur n’a pas donné son consentement et 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 Session ne sont pas fonctionnelles lorsque le suivi est désactivé.TempData and Session cookies aren't functional when tracking is disabled.
  • Le gérer les identités page fournit un lien pour télécharger et supprimer des données de l’utilisateur.The Identity manage page provides a link to download and delete user data.

Le exemple d’application permet de vous tester la plupart des points d’extension RGPD et API ajoutées 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 Lisez-moi fichier d’instructions de test.See the ReadMe file for testing instructions.

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

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

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

  • CookiePolicyOptions et UseCookiePolicy sont définies le Startup classe.CookiePolicyOptions and UseCookiePolicy are set in the Startup class.
  • Le _CookieConsentPartial.cshtml vue partielle.The _CookieConsentPartial.cshtml partial view. Un Accept bouton est inclus dans ce fichier.An Accept button is included in this file. Lorsque l’utilisateur clique sur le Accept bouton, de donner son consentement pour stocker des cookies est fourni.When the user clicks the Accept button, consent to store cookies is provided.
  • Le Pages/Privacy.cshtml page ou Views/Home/Privacy.cshtml vue fournit une page qui décrit en détail 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 _CookieConsentPartial.cshtml fichier génère un lien vers la page de la 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 de gestion fournit des liens pour télécharger et supprimer des données personnelles utilisateur.For apps created with individual user accounts, the Manage page provides links to download and delete personal user data.

CookiePolicyOptions et UseCookiePolicyCookiePolicyOptions and UseCookiePolicy

CookiePolicyOptions sont initialisées 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ée 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 CookieConsentPartial.cshtml_CookieConsentPartial.cshtml partial view

Le _CookieConsentPartial.cshtml vue partielle :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>
}

Partielle :This partial:

  • Obtient l’état de suivi pour l’utilisateur.Obtains the state of tracking for the user. Si l’application est configurée pour demander le consentement, l’utilisateur doit donner son consentement avant que les cookies peuvent être suivis.If the app is configured to require consent, the user must consent before cookies can be tracked. Si un consentement est requis, le panneau de consentement de cookie est résolu en haut de la barre de navigation créée par le _Layout.cshtml fichier.If consent is required, the cookie consent panel is fixed at top of the navigation bar created by the _Layout.cshtml file.
  • Fournit un élément HTML <p> élément permet de synthétiser votre confidentialité et le cookie utiliser la stratégie.Provides an HTML <p> element to summarize your privacy and cookie use policy.
  • Fournit un lien vers la page de la confidentialité ou la vue dans laquelle vous pouvez décrit en détail 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 essentiellesEssential cookies

Si donner son consentement pour stocker des cookies n’a pas été fourni, uniquement les cookies marqués essentielles 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 fait un cookie essentielles :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");
}

Cookies d’état de session et le fournisseur TempData ne sont pas essentielsTempData provider and session state cookies aren't essential

Le fournisseur TempData cookie n’est pas indispensable.The TempData provider cookie isn't essential. Si le suivi est désactivé, le fournisseur de 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é, marquer le cookie de TempData comme essentielle 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;
});

État de session les cookies ne sont pas indispensables.Session state cookies are not essential. É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 fait les cookies de session essentielles :The following code makes session cookies essential:

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

Données personnellesPersonal data

Les applications ASP.NET Core créées avec les 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 les données personnelles:Select the user name and then select Personal data:

Gérer les données personnelles

Remarques :Notes:

  • Pour générer le Account/Manage de code, consultez identité d’une structure.To generate the Account/Manage code, see Scaffold Identity.
  • Le supprimer et télécharger liens 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é doivent être étendues pour delete/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 les données d’utilisateur personnalisée pour identité.For more information, see Add, download, and delete custom user data to Identity.
  • Enregistré des jetons pour l’utilisateur qui sont stockées dans la table de base de données d’identité AspNetUserTokens sont supprimés lorsque l’utilisateur est supprimé via le comportement de suppression en cascade en raison du 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, tels que Facebook et Google, n’est pas disponible avant l’acceptation de la stratégie de cookie.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 les mécanismes de stockage autorisent 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, de programmation ou d’autres tâches pour le logiciel qui accède aux données.Encrypts without configuration, programming, or other work for the software that accesses the data.
  • Option est la plus simple et plus sûre.Is the easiest and safest option.
  • Permet de gérer les clés et chiffrement de la base de données.Allows the database to manage keys and encryption.

Par exemple :For example:

Pour les bases de données qui ne fournissent pas un chiffrement intégré au repos, vous pourrez peut-être utiliser le chiffrement de disque pour fournir le même niveau de 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