Prise en charge du règlement général sur la protection des données (RGPD) de l’Union Européenne dans ASP.NET Core

Par Rick Anderson

ASP.NET Core fournit des API et des modèles qui aident à satisfaire à certaines des exigences du Règlement général sur la protection des données (RGPD) :

  • Les modèles de projet incluent des points d’extension et des marques de révision que vous pouvez remplacer par votre politique de privacy et d’utilisation des cookie.
  • La page Pages/Privacy.cshtml ou la vue Views/Home/Privacy.cshtml est une page qui détaille la politique de privacy de votre site.

Pour activer la fonctionnalité de consentement par défaut cookie telle que celle qui se trouve dans les modèles ASP.NET Core 2.2 dans une application de modèle ASP.NET Core actuelle générée, ajoutez le code en surbrillance suivant à 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();

Dans le code précédent, CookiePolicyOptions et UseCookiePolicy sont tous deux utilisés.

  • Ajoutez le cookie consentement partiel au _Layout.cshtml fichier :

                @*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>
    
  • Ajoutez le fichier _CookieConsentPartial.cshtml au projet :

    @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>
    }
    
  • Sélectionnez la version ASP.NET Core 2.2 de cet article pour en savoir plus sur la fonctionnalité de cookie consentement.

Spécifiez la valeur utilisée pour suivre si l’utilisateur a consenti à la stratégie d’utilisation à l’aide cookie de la CookiePolicyOptions.ConsentCookieValue propriété :

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

Chiffrement au rest

Certaines bases de données et certains mécanismes de stockage permettent le chiffrement au rest. Chiffrement au rest :

  • Chiffre automatiquement les données stockées.
  • Chiffre sans configuration, programmation ou autre travail pour le logiciel qui accède aux données.
  • Est l’option la plus simple et la plus sûre.
  • Permet à la base de données de gérer les clés et le chiffrement.

Par exemple :

Pour les bases de données qui ne fournissent pas de chiffrement intégré au rest, vous pouvez peut-être utiliser le chiffrement de disque pour fournir la même protection. Par exemple :

Ressources supplémentaires

  • Les modèles de projet incluent des points d’extension et des marques de révision que vous pouvez remplacer par votre politique de privacy et d’utilisation des cookie.
  • Une cookie fonctionnalité de consentement vous permet de demander (et de suivre) le consentement de vos utilisateurs pour stocker des informations personnelles. Si un utilisateur n’a pas consenti à la collecte de données et que l’application a réglé CheckConsentNeeded sur true, les cookies non essentiels ne sont pas envoyés au navigateur.
  • Les cookies peuvent être marqués comme essentiels. 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é.
  • Les cookies TempData et de session ne sont pas fonctionnels lorsque le suivi est désactivé.
  • La Identity page gérer fournit un lien pour télécharger et supprimer des données utilisateur.

L’exemple d’application vous permet de tester la plupart des API et points d’extension RGPD ajoutés aux modèles ASP.NET Core 2.1. Consultez le fichier ReadMe pour obtenir des instructions de test.

Affichez ou téléchargez l’exemple de code (procédure de téléchargement)

ASP.NET Core la prise en charge du RGPD dans le code généré par modèle

Razor Les pages et les projets MVC créés avec les modèles de projet incluent la prise en charge du RGPD suivante :

  • CookiePolicyOptions et UseCookiePolicy sont définis dans la Startup classe .
  • La vue partielle _CookieConsentPartial.cshtml. Un bouton Accepter est inclus dans ce fichier. Lorsque l’utilisateur clique sur le bouton Accepter, il donne son consentement au stockage des cookies.
  • La page Pages/Privacy.cshtml ou la vue Views/Home/Privacy.cshtml est une page qui détaille la politique de privacy de votre site. Le fichier _CookieConsentPartial.cshtml génère un lien vers la page qui traite de la Privacy.
  • 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.

CookiePolicyOptions et UseCookiePolicy

CookiePolicyOptions sont initialisés dans 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 :

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

La vue partielle _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>
}

Ce partiel :

  • Obtient l’état du suivi pour l’utilisateur. Si l’application est configurée pour exiger le consentement, l’utilisateur doit donner son accord avant que les cookies puissent être suivis. Si le consentement est requis, le cookie panneau de consentement est fixé en haut de la barre de navigation créée par le fichier _Layout.cshtml .
  • Fournit un élément de <p> HTML pour résumer votre politique de privacy et d’utilisation des cookie.
  • Fournit un lien vers la page ou la vue qui traite de la Privacy dans laquelle vous pouvez détailler la politique de privacy de votre site.

Cookies essentiels

Si le consentement au stockage des cookies n’a pas été fourni, seuls les cookies marqués comme essentiels sont envoyés au navigateur. Le code suivant rend un cookie élément essentiel :

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

Le fournisseur TempData et l’état de session ne sont pas essentiels

Le fournisseurcookie TempData n’est pas essentiel. Si le suivi est désactivé, le fournisseur TempData n’est pas fonctionnel. Pour activer le fournisseur TempData lorsque le suivi est désactivé, marquez le TempData cookie comme essentiel dans 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 État de session ne sont pas essentiels. L’état de session n’est pas fonctionnel lorsque le suivi est désactivé. Le code suivant rend les cookies de session essentiels :

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

Données à caractère personnel

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.

Sélectionnez le nom d’utilisateur, puis sélectionnez Données personnelles :

Gérer les données de page personnelles

Remarques :

  • Pour générer le Account/Manage code, consultez Scaffold Identity.
  • Les liens Supprimer et Télécharger agissent uniquement sur les données d’identity par défaut. 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. Pour plus d’informations, consultez Ajouter, télécharger et supprimer des données utilisateur personnalisées dans Identity.
  • Les jetons enregistrés pour l’utilisateur stockés dans la Identity table AspNetUserTokens de base de données sont supprimés lorsque l’utilisateur est supprimé via le comportement de suppression en cascade en raison de la clé étrangère.
  • L’authentification de fournisseur externe, telle que Facebook et Google, n’est pas disponible avant l’acceptation de la cookie stratégie.

Chiffrement au rest

Certaines bases de données et certains mécanismes de stockage permettent le chiffrement au rest. Chiffrement au rest :

  • Chiffre automatiquement les données stockées.
  • Chiffre sans configuration, programmation ou autre travail pour le logiciel qui accède aux données.
  • Est l’option la plus simple et la plus sûre.
  • Permet à la base de données de gérer les clés et le chiffrement.

Par exemple :

Pour les bases de données qui ne fournissent pas de chiffrement intégré au rest, vous pouvez peut-être utiliser le chiffrement de disque pour fournir la même protection. Par exemple :

Ressources supplémentaires

  • Les modèles de projet incluent des points d’extension et des marques de révision que vous pouvez remplacer par votre politique de privacy et d’utilisation des cookie.
  • La page Pages/Privacy.cshtml ou la vue Views/Home/Privacy.cshtml est une page qui détaille la politique de privacy de votre site.

Pour activer la fonctionnalité de consentement par défaut cookie telle que celle qui se trouve dans les modèles ASP.NET Core 2.2 dans une application de modèle ASP.NET Core actuelle générée :

  • Ajoutez using Microsoft.AspNetCore.Http à la liste des directives using.

  • Ajoutez CookiePolicyOptions à Startup.ConfigureServices et UseCookiePolicy à 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 cookie consentement partiel au _Layout.cshtml fichier :

            @*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 :

    @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é cookie de consentement.

  • Les modèles de projet incluent des points d’extension et des marques de révision que vous pouvez remplacer par votre politique de privacy et d’utilisation des cookie.
  • La page Pages/Privacy.cshtml ou la vue Views/Home/Privacy.cshtml est une page qui détaille la politique de privacy de votre site.

Pour activer la fonctionnalité de consentement par défaut cookie telle que celle qui se trouve dans les modèles ASP.NET Core 2.2 dans une application de modèle ASP.NET Core actuelle générée, ajoutez le code en surbrillance suivant à 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();

Dans le code précédent, CookiePolicyOptions et UseCookiePolicy sont tous deux utilisés.

  • Ajoutez le cookie consentement partiel au _Layout.cshtml fichier :

                @*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>
    
  • Ajoutez le fichier _CookieConsentPartial.cshtml au projet :

    @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>
    }
    
  • Sélectionnez la version ASP.NET Core 2.2 de cet article pour en savoir plus sur la fonctionnalité de cookie consentement.

Chiffrement au rest

Certaines bases de données et certains mécanismes de stockage permettent le chiffrement au rest. Chiffrement au rest :

  • Chiffre automatiquement les données stockées.
  • Chiffre sans configuration, programmation ou autre travail pour le logiciel qui accède aux données.
  • Est l’option la plus simple et la plus sûre.
  • Permet à la base de données de gérer les clés et le chiffrement.

Par exemple :

Pour les bases de données qui ne fournissent pas de chiffrement intégré au rest, vous pouvez peut-être utiliser le chiffrement de disque pour fournir la même protection. Par exemple :

Ressources supplémentaires