Compatibilidad con Reglamento general de protección de datos de la Unión Europea (RGPD) en ASP.NET CoreEU General Data Protection Regulation (GDPR) support in ASP.NET Core

Por Rick AndersonBy Rick Anderson

ASP.NET Core proporciona API y plantillas para ayudar a cumplir algunos de los requisitos de la Reglamento general de protección de datos de la UE (RGPD) :ASP.NET Core provides APIs and templates to help meet some of the EU General Data Protection Regulation (GDPR) requirements:

  • Las plantillas de proyecto incluyen puntos de extensión y marcado stub que se pueden reemplazar con la Directiva de privacidad y cookie uso.The project templates include extension points and stubbed markup that you can replace with your privacy and cookie use policy.
  • La página pages/privacy. cshtml o views /Home/privacy. cshtml proporciona una página para detallar la Directiva de privacidad de su sitio.The Pages/Privacy.cshtml page or Views/Home/Privacy.cshtml view provides a page to detail your site's privacy policy.

Para habilitar la característica de consentimiento predeterminado, cookie como la que se encuentra en las plantillas de ASP.NET Core 2,2 en una aplicación de ASP.NET Core 3,0 plantillas generadas: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:

  • Agregue using Microsoft.AspNetCore.Http a la lista de directivas using.Add using Microsoft.AspNetCore.Http to the list of using directives.

  • Agregue Cookie PolicyOptions a Startup.ConfigureServices y use la Cookie Directiva para 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();
            });
        }
    }
    
  • Agregue el cookie consentimiento parcial al archivo _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>
    
    
  • Agregue el archivo _ Cookie ConsentPartial. cshtml al proyecto: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>
    }
    
  • Seleccione la versión ASP.NET Core 2,2 de este artículo para obtener información acerca de la cookie característica de consentimiento.Select the ASP.NET Core 2.2 version of this article to read about the cookie consent feature.

  • Las plantillas de proyecto incluyen puntos de extensión y marcado stub que se pueden reemplazar con la Directiva de privacidad y cookie uso.The project templates include extension points and stubbed markup that you can replace with your privacy and cookie use policy.
  • Una cookie característica de consentimiento le permite solicitar (y realizar un seguimiento) el consentimiento de los usuarios para almacenar información personal.A cookie consent feature allows you to ask for (and track) consent from your users for storing personal information. Si un usuario no ha dado su consentimiento a la recopilación de datos y la aplicación tiene CheckConsentNeeded establecido en, no se true cookie enviarán s no esenciales al explorador.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.
  • Cookies se pueden marcar como esenciales.Cookies can be marked as essential. Los cookie s esenciales se envían al explorador incluso cuando el usuario no ha dado su consentimiento y el seguimiento está deshabilitado.Essential cookies are sent to the browser even when the user hasn't consented and tracking is disabled.
  • TempData y las cookie sesiones no funcionan cuando el seguimiento está deshabilitado.TempData and Session cookies aren't functional when tracking is disabled.
  • La página Identity administrar proporciona un vínculo para descargar y eliminar los datos de usuario.The Identity manage page provides a link to download and delete user data.

La aplicación de ejemplo permite probar la mayoría de los puntos de extensión RGPD y las API agregadas a las plantillas 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. Vea el archivo Léame para obtener instrucciones de prueba.See the ReadMe file for testing instructions.

Vea o descargue el código de ejemplo (cómo descargarlo)View or download sample code (how to download)

Compatibilidad de ASP.NET Core RGPD en el código generado por plantillasASP.NET Core GDPR support in template-generated code

Razor Las páginas y los proyectos de MVC creados con las plantillas de proyecto incluyen la siguiente compatibilidad con RGPD:Razor Pages and MVC projects created with the project templates include the following GDPR support:

  • Cookie PolicyOptions y la Cookie Directiva de uso se establecen en la Startup clase.CookiePolicyOptions and UseCookiePolicy are set in the Startup class.
  • Vista parcialde _ Cookie ConsentPartial. cshtml .The _CookieConsentPartial.cshtml partial view. En este archivo se incluye un botón Aceptar .An Accept button is included in this file. Cuando el usuario hace clic en el botón Aceptar , se proporciona el consentimiento a la tienda cookie .When the user clicks the Accept button, consent to store cookies is provided.
  • La página pages/privacy. cshtml o views /Home/privacy. cshtml proporciona una página para detallar la Directiva de privacidad de su sitio.The Pages/Privacy.cshtml page or Views/Home/Privacy.cshtml view provides a page to detail your site's privacy policy. El archivo _ Cookie ConsentPartial. cshtml genera un vínculo a la página de privacidad.The _CookieConsentPartial.cshtml file generates a link to the Privacy page.
  • En el caso de las aplicaciones creadas con cuentas de usuario individuales, la página Administrar proporciona vínculos para descargar y eliminar los datos personalesde los usuarios.For apps created with individual user accounts, the Manage page provides links to download and delete personal user data.

CookiePolicyOptions y uso de la Cookie DirectivaCookiePolicyOptions and UseCookiePolicy

Cookie PolicyOptions se inicializan en 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();
    }
}

Usar Cookie Se llama a la Directiva en 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();
    }
}

_CookieVista parcial de ConsentPartial. cshtml_CookieConsentPartial.cshtml partial view

La vista parcial de _ Cookie ConsentPartial. 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>
}

Este:This partial:

  • Obtiene el estado de seguimiento del usuario.Obtains the state of tracking for the user. Si la aplicación está configurada para requerir el consentimiento, el usuario debe dar su consentimiento antes de cookie que se pueda realizar el seguimiento de.If the app is configured to require consent, the user must consent before cookies can be tracked. Si se requiere el consentimiento, el cookie Panel de consentimiento se fija en la parte superior de la barra de navegación creada por el archivo _ layout. cshtml .If consent is required, the cookie consent panel is fixed at top of the navigation bar created by the _Layout.cshtml file.
  • Proporciona un <p> elemento HTML para resumir la privacidad y la cookie Directiva de uso.Provides an HTML <p> element to summarize your privacy and cookie use policy.
  • Proporciona un vínculo a la página de privacidad o vista donde puede obtener detalles de la Directiva de privacidad del sitio.Provides a link to Privacy page or view where you can detail your site's privacy policy.

Essential cookie sEssential cookies

Si no cookie se ha proporcionado el consentimiento para la tienda, solo cookie se envían al explorador los s marcados como esenciales.If consent to store cookies hasn't been provided, only cookies marked essential are sent to the browser. El código siguiente hace que sea cookie esencial: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");
}

El proveedor TempData y el estado de sesión cookie s no son esencialesTempData provider and session state cookies aren't essential

El proveedor TempData cookie no es esencial.The TempData provider cookie isn't essential. Si el seguimiento está deshabilitado, el proveedor TempData no funciona.If tracking is disabled, the TempData provider isn't functional. Para habilitar el proveedor TempData cuando el seguimiento está deshabilitado, marque TempData cookie como Essential en 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;
});

Estado cookie de sesión s no son esenciales.Session state cookies are not essential. El estado de sesión no funciona cuando el seguimiento está deshabilitado.Session state isn't functional when tracking is disabled. El código siguiente hace que las sesiones sean cookie esenciales:The following code makes session cookies essential:

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

Datos personalesPersonal data

ASP.NET Core aplicaciones creadas con cuentas de usuario individuales incluyen código para descargar y eliminar los datos personales.ASP.NET Core apps created with individual user accounts include code to download and delete personal data.

Seleccione el nombre de usuario y, a continuación, seleccione datos personales :Select the user name and then select Personal data :

Página administrar datos personales

Notas:Notes:

  • Para generar el Account/Manage código, consulte scaffold Identity .To generate the Account/Manage code, see Scaffold Identity.
  • Los vínculos de eliminación y descarga solo actúan sobre los datos de identidad predeterminados.The Delete and Download links only act on the default identity data. Las aplicaciones que crean datos de usuario personalizados deben extenderse para eliminar o descargar los datos de usuario personalizados.Apps that create custom user data must be extended to delete/download the custom user data. Para obtener más información, vea Agregar, descargar y eliminar datos de usuario personalizados Identity en .For more information, see Add, download, and delete custom user data to Identity.
  • Los tokens guardados para el usuario que se almacenan en la Identity tabla de base de datos AspNetUserTokens se eliminan cuando se elimina el usuario mediante el comportamiento de eliminación en cascada debido a la clave externa.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.
  • La autenticación de proveedor externo, como Facebook y Google, no está disponible antes de que cookie se acepte la Directiva.External provider authentication, such as Facebook and Google, isn't available before the cookie policy is accepted.

Cifrado en reposoEncryption at rest

Algunas bases de datos y mecanismos de almacenamiento permiten el cifrado en reposo.Some databases and storage mechanisms allow for encryption at rest. Cifrado en reposo:Encryption at rest:

  • Cifra automáticamente los datos almacenados.Encrypts stored data automatically.
  • Cifra sin configuración, programación u otro trabajo para el software que tiene acceso a los datos.Encrypts without configuration, programming, or other work for the software that accesses the data.
  • Es la opción más sencilla y más segura.Is the easiest and safest option.
  • Permite a la base de datos administrar las claves y el cifrado.Allows the database to manage keys and encryption.

Por ejemplo:For example:

En el caso de las bases de datos que no proporcionan cifrado integrado en reposo, es posible que pueda usar el cifrado de disco para proporcionar la misma protección.For databases that don't provide built-in encryption at rest, you may be able to use disk encryption to provide the same protection. Por ejemplo:For example:

Recursos adicionalesAdditional resources