Soporte técnico del Reglamento General de protección de datos (RGPD) de la UE en ASP.NET CoreEU General Data Protection Regulation (GDPR) support in ASP.NET Core

Por Rick AndersonBy Rick Anderson

ASP.NET Core proporciona las API y plantillas para ayudar a cumplir algunos de los Reglamento General de protección de datos (RGPD) de la UE requisitos: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 auxiliar marcado que se puede reemplazar con la privacidad y la directiva de uso de cookies.The project templates include extension points and stubbed markup that you can replace with your privacy and cookie use policy.
  • El Pages/Privacy.cshtml página o Views/Home/Privacy.cshtml vista proporciona una página para detallar política 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 de cookie predeterminado que se encuentra en las plantillas de ASP.NET Core 2.2 en una aplicación de ASP.NET Core 3.0 plantilla generada: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:

  • Agregar CookiePolicyOptions demasiado Startup.ConfigureServices y UseCookiePolicy a 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();
            });
        }
    }
    
  • Agregar la parcial de consentimiento de cookie para la _Layout.cshtml archivo: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>
    
    
  • Agregar el _CookieConsentPartial.cshtml archivo 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 de ASP.NET Core 2.2 de este artículo para obtener información acerca de la característica de consentimiento de la cookie.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 auxiliar marcado que se puede reemplazar con la privacidad y la directiva de uso de cookies.The project templates include extension points and stubbed markup that you can replace with your privacy and cookie use policy.
  • Una característica de consentimiento de cookie permite pedir consentimiento (y realizar un seguimiento) 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 para la recopilación de datos y la aplicación tiene CheckConsentNeeded establecido en true, las cookies no esenciales no se envían 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.
  • Las cookies se pueden marcar como esenciales.Cookies can be marked as essential. Esencial cookies se envían al explorador incluso cuando el usuario no ha dado su consentimiento y seguimiento está deshabilitado.Essential cookies are sent to the browser even when the user hasn't consented and tracking is disabled.
  • Las cookies de TempData y Session no funcionan cuando se deshabilita el seguimiento.TempData and Session cookies aren't functional when tracking is disabled.
  • El administrar identidades página proporciona un vínculo para descargar y eliminar datos de usuario.The Identity manage page provides a link to download and delete user data.

El aplicación de ejemplo permite probar la mayoría de los puntos de extensión de RGPD y las API agregadas a las plantillas de 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. Consulte la Léame archivo para las pruebas de instrucciones.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)

ASP.NET Core RGPD se admiten en código generado por plantillaASP.NET Core GDPR support in template-generated code

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

  • CookiePolicyOptions y UseCookiePolicy se establecen en el Startup clase.CookiePolicyOptions and UseCookiePolicy are set in the Startup class.
  • El _CookieConsentPartial.cshtml vista parcial.The _CookieConsentPartial.cshtml partial view. Un Accept botón se incluye en este archivo.An Accept button is included in this file. Cuando el usuario hace clic en el Accept botón, da su consentimiento para almacenar las cookies se proporciona.When the user clicks the Accept button, consent to store cookies is provided.
  • El Pages/Privacy.cshtml página o Views/Home/Privacy.cshtml vista proporciona una página para detallar política 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 _CookieConsentPartial.cshtml archivo genera un vínculo a la página de privacidad.The _CookieConsentPartial.cshtml file generates a link to the Privacy page.
  • Las aplicaciones creadas con cuentas de usuario individuales, la página de administración proporciona vínculos para descargar y eliminar personal del usuario.For apps created with individual user accounts, the Manage page provides links to download and delete personal user data.

CookiePolicyOptions y UseCookiePolicyCookiePolicyOptions and UseCookiePolicy

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

UseCookiePolicy se denomina 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();
    }
}

_Vista parcial CookieConsentPartial.cshtml_CookieConsentPartial.cshtml partial view

El _CookieConsentPartial.cshtml vista parcial: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 parcial:This partial:

  • Obtiene el estado de seguimiento para el usuario.Obtains the state of tracking for the user. Si la aplicación está configurada para requerir consentimiento, el usuario debe dar su consentimiento antes de que pueden realizar el seguimiento de las cookies.If the app is configured to require consent, the user must consent before cookies can be tracked. Si se requiere el consentimiento, el panel de consentimiento de la cookie se fija en la parte superior de la barra de navegación creada por el _Layout.cshtml archivo.If consent is required, the cookie consent panel is fixed at top of the navigation bar created by the _Layout.cshtml file.
  • Proporciona una etiqueta HTML <p> usar la directiva de elemento que se va a resumir su privacidad y cookies.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 detallan la directiva de privacidad de su sitio.Provides a link to Privacy page or view where you can detail your site's privacy policy.

Cookies esencialesEssential cookies

Si su consentimiento almacenar las cookies no ha facilitado, solo las cookies de marcado esencial se envían al explorador.If consent to store cookies hasn't been provided, only cookies marked essential are sent to the browser. El código siguiente realiza una cookie esenciales: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 de estado de sesión y el proveedor TempData 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 se deshabilita el seguimiento, el proveedor TempData no funcionará.If tracking is disabled, the TempData provider isn't functional. Para habilitar el proveedor TempData cuando se deshabilita el seguimiento, marcar la cookie de TempData como esencial 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 de sesión las cookies no son esenciales.Session state cookies are not essential. Estado de sesión no funcionará cuando se deshabilita el seguimiento.Session state isn't functional when tracking is disabled. El código siguiente hace que las cookies de sesión esenciales:The following code makes session cookies essential:

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

Datos personalesPersonal data

Las aplicaciones de ASP.NET Core creadas con cuentas de usuario individuales incluyen código para descargar y eliminar 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 de datos personales de administración

Notas:Notes:

  • Para generar el Account/Manage código, vea Scaffold identidad.To generate the Account/Manage code, see Scaffold Identity.
  • El eliminar y descargar vínculos solo actúan sobre los datos de identidad predeterminada.The Delete and Download links only act on the default identity data. Las aplicaciones que crean datos de usuario personalizada deben ampliarse para eliminación y descarga los datos de usuario personalizada.Apps that create custom user data must be extended to delete/download the custom user data. Para obtener más información, consulte Add, descargar y eliminar datos de usuario personalizada para identidad.For more information, see Add, download, and delete custom user data to Identity.
  • Guarda los tokens para el usuario que se almacenan en la tabla de base de datos de identidad AspNetUserTokens se eliminan cuando el usuario se elimina 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.
  • Autenticación de proveedor externo, como Facebook y Google, no está disponible antes de que 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 para 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 otros trabajos 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 segura.Is the easiest and safest option.
  • Permite administrar las claves y cifrado de la base de datos.Allows the database to manage keys and encryption.

Por ejemplo:For example:

Para las bases de datos que no proporcionan cifrado integrado en reposo, puede 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