Compatibilidad con Reglamento general de protección de datos ue (RGPD) en ASP.NET Core

Por 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 ue (RGPD):

  • Las plantillas de proyecto incluyen puntos de extensión y marcado con código auxiliar que puede reemplazar por su directiva de privacidad cookie y uso.
  • La página Privacy Pages/.cshtml o la vista Views/ Home / Privacy .cshtml proporcionan una página para detallar la directiva de privacidad del sitio.

Para habilitar la característica de consentimiento predeterminada como la que se encuentra en las plantillas de ASP.NET Core 2.2 en una aplicación generada ASP.NET Core cookie plantilla de ASP.NET Core 3.0:

  • Agregue using Microsoft.AspNetCore.Http a la lista de directivas using.

  • Agregue Cookie PolicyOptions a Startup.ConfigureServices y Use Cookie Policy 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:

            @*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 _ Cookie archivo ConsentPartial.cshtml al proyecto:

    @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 ASP.NET Core versión 2.2 de este artículo para leer sobre la característica cookie de consentimiento.

  • Las plantillas de proyecto incluyen puntos de extensión y marcado con código auxiliar que puede reemplazar por su directiva de privacidad cookie y uso.
  • Una característica de consentimiento le permite solicitar (y realizar un seguimiento) del cookie consentimiento de los usuarios para almacenar información personal. Si un usuario no ha dado su consentimiento a la recopilación de datos y la aplicación tiene CheckConsentNeeded establecido en , los no esenciales no se envían true cookie al explorador.
  • Cookies se puede marcar como esencial. Los elementos esenciales se envían al explorador incluso cuando el usuario no ha cookie dado su consentimiento y el seguimiento está deshabilitado.
  • TempData y Session cookie no funcionan cuando el seguimiento está deshabilitado.
  • La Identity página administrar proporciona un vínculo para descargar y eliminar datos de usuario.

La aplicación de ejemplo permite probar la mayoría de los puntos de extensión del RGPD y las API agregadas a las ASP.NET Core 2.1. Consulte el archivo Léame para obtener instrucciones de prueba.

Vea o descargue el código de ejemplo (cómo descargarlo)

ASP.NET Core Compatibilidad con RGPD en código generado por plantilla

Razor Los proyectos de Pages y MVC creados con las plantillas de proyecto incluyen la siguiente compatibilidad con RGPD:

  • Cookie PolicyOptions y Use Cookie Policy se establecen en la clase Startup .
  • La _ Cookie vista parcial ConsentPartial.cshtml . En este archivo se incluye un botón Aceptar. Cuando el usuario hace clic en el botón Aceptar, se proporciona consentimiento para cookie almacenar.
  • La página Privacy Pages/.cshtml o la vista Views/ Home / Privacy .cshtml proporcionan una página para detallar la directiva de privacidad del sitio. El _ Cookie archivo ConsentPartial.cshtml genera un vínculo a la Privacy página.
  • Para las aplicaciones creadas con cuentas de usuario individuales, la página Administrar proporciona vínculos para descargar y eliminar datos de usuario personales.

CookieDirectivaOpciones y usar Cookie directiva

Cookie PolicyOptions se inicializa en 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 La directiva se llama en 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 consentPartial.cshtml

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

Esta parcial:

  • Obtiene el estado de seguimiento del usuario. Si la aplicación está configurada para requerir consentimiento, el usuario debe dar su consentimiento para poder cookie realizar el seguimiento de . Si se requiere consentimiento, el panel de consentimiento se fija en la parte superior de la barra de cookie navegación creada por el archivo _ Layout.cshtml.
  • Proporciona un elemento HTML <p> para resumir la directiva de privacidad y cookie uso.
  • Proporciona un vínculo a Privacy la página o vista donde puede detallar la directiva de privacidad del sitio.

Elementos cookie esenciales

Si no se ha proporcionado consentimiento para almacenar, solo se envían al explorador los elementos cookie cookie marcados como esenciales. El código siguiente hace que sea cookie esencial:

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 los cookie estados de sesión no son esenciales

El proveedor TempData cookie no es esencial. Si el seguimiento está deshabilitado, el proveedor TempData no es funcional. Para habilitar el proveedor TempData cuando el seguimiento está deshabilitado, marque TempData cookie como esencial en 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 cookie no son esenciales. El estado de sesión no funciona cuando el seguimiento está deshabilitado. El código siguiente hace que la cookie sesión sea esencial:

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

Datos personales

ASP.NET Core aplicaciones creadas con cuentas de usuario individuales incluyen código para descargar y eliminar datos personales.

Seleccione el nombre de usuario y, a continuación, seleccione Datos personales:

Página Administrar datos personales

Notas:

  • Para generar el Account/Manage código, vea Scaffold Identity .
  • Los vínculos Eliminar y Descargar solo actúan sobre los datos de identidad predeterminados. Las aplicaciones que crean datos de usuario personalizados deben ampliarse para eliminar o descargar los datos de usuario personalizados. Para obtener más información, vea Agregar, descargar Identity y eliminar datos de usuario personalizados en .
  • Los tokens guardados para el usuario almacenados en la tabla de base de datos se eliminan cuando el usuario se elimina a través del comportamiento de eliminación en cascada debido Identity a la clave AspNetUserTokens externa.
  • La autenticación deproveedores externos, como Facebook y Google, no está disponible antes de cookie que se acepte la directiva.

Cifrado en reposo

Algunas bases de datos y mecanismos de almacenamiento permiten el cifrado en reposo. Cifrado en reposo:

  • Cifra automáticamente los datos almacenados.
  • Cifra sin configuración, programación u otro trabajo para el software que accede a los datos.
  • Es la opción más fácil y segura.
  • Permite que la base de datos administre las claves y el cifrado.

Por ejemplo:

En el caso de las bases de datos que no proporcionan cifrado integrado en reposo, puede usar el cifrado de disco para proporcionar la misma protección. Por ejemplo:

Recursos adicionales