Compartir vía


Compatibilidad con el Reglamento general de protección de datos (RGPD) de la UE en ASP.NET Core Blazor

Nota

Esta no es la versión más reciente de este artículo. Para la versión actual, consulte la versión .NET 9 de este artículo.

Advertencia

Ya no se admite esta versión de ASP.NET Core. Para más información, consulte la directiva de soporte técnico de .NET y .NET Core. Para la versión actual, consulte la versión .NET 9 de este artículo.

Importante

Esta información se relaciona con un producto de versión preliminar que puede modificarse sustancialmente antes de su publicación comercial. Microsoft no ofrece ninguna garantía, expresa o implícita, con respecto a la información proporcionada aquí.

Para la versión actual, consulte la versión .NET 9 de este artículo.

En este artículo se explica cómo implementar la compatibilidad con Reglamento general de protección de datos de la EU (GDPR) requisitos.

En el archivo Program:

builder.Services.Configure<CookiePolicyOptions>(options =>
{
    options.CheckConsentNeeded = context => true;

    options.MinimumSameSitePolicy = SameSiteMode.None;
});

builder.Services.AddHttpContextAccessor();

En el archivo Program antes de la llamada a MapRazorComponents, agregue Cookie Policy Middleware llamando a UseCookiePolicy:

En el archivo Program antes de la llamada a MapBlazorHub agregar Middleware de Directivas Cookie llamando a UseCookiePolicy:

app.UseCookiePolicy();

Agregue el siguiente componente CookieConsent para manejar el consentimiento de la política cookie.

El componente utiliza un archivo JavaScript ubicado, denominado CookieConsent.razor.js, para cargar un módulo. Confirme o ajuste la ruta de acceso al archivo intercalado en el método OnAfterRenderAsync. En el componente siguiente se supone que el componente y su archivo JavaScript complementario están en la carpeta Components de la aplicación.

CookieConsent.razor:

@using Microsoft.AspNetCore.Http.Features
@using Microsoft.AspNetCore.Http
@implements IAsyncDisposable
@inject IHttpContextAccessor Http
@inject IJSRuntime JS

@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 href="/privacy">Privacy Policy</a>
        <button type="button" @onclick="AcceptPolicy" class="accept-policy close" 
            data-bs-dismiss="alert" aria-label="Close" 
            data-cookie-string="@cookieString">
            Accept
        </button>
    </div>
}
@code {
    private IJSObjectReference? module;
    private ITrackingConsentFeature? consentFeature;
    private bool showBanner;
    private string? cookieString;

    protected override void OnInitialized()
    {
        consentFeature = Http.HttpContext?.Features.Get<ITrackingConsentFeature>();
        showBanner = !consentFeature?.CanTrack ?? false;
        cookieString = consentFeature?.CreateConsentCookie();
    }

    protected override async Task OnAfterRenderAsync(bool firstRender)
    {
        if (firstRender)
        {
            module = await JS.InvokeAsync<IJSObjectReference>("import",
                "./Components/CookieConsent.razor.js");
        }
    }

    private async Task AcceptPolicy()
    {
        if (module is not null)
        {
            await module.InvokeVoidAsync("acceptPolicy", cookieString);
            showBanner = false;
        }
    }

    async ValueTask IAsyncDisposable.DisposeAsync()
    {
        if (module is not null)
        {
            try
            {
                await module.DisposeAsync();
            }
            catch (JSDisconnectedException)
            {
            }
        }
    }
}

Agregue el archivo JavaScript correspondiente para mantener la función acceptPolicy en un módulo de JavaScript.

CookieConsent.razor.js:

export function acceptPolicy(cookieString) {
  document.cookie = cookieString;
}

En el etiquetado <main>Razor del componente MainLayout (MainLayout.razor), agregue el componente CookieConsent:

<CookieConsent />

Especifique el valor de consentimiento cookie asignando una cadena personalizada a CookiePolicyOptions.ConsentCookieValue. En el ejemplo siguiente se cambia el valor predeterminado de "yes" a "true":

options.ConsentCookieValue = "true";

En las Blazor WebAssembly aplicaciones, almacenamiento local es un enfoque cómodo para mantener que un usuario acepte la política cookie de un sitio. El enfoque siguiente muestra el método.

Si la aplicación aún no tiene una carpeta Shared para los componentes compartidos, agregue una carpeta Shared a la aplicación.

Agregue el espacio de nombres para los componentes compartidos al archivo _Imports.razor. En el ejemplo siguiente, el espacio de nombres de la aplicación es BlazorSampley el espacio de nombres de la carpeta compartida es BlazorSample.Shared:

@using BlazorSample.Shared

Agregue el siguiente componente CookieConsent para manejar el consentimiento de la política cookie.

Shared/CookieConsent.razor:

@implements IAsyncDisposable
@inject IJSRuntime JS

@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 href="/privacy">Privacy Policy</a>
        <button type="button" @onclick="AcceptPolicy" class="accept-policy close"
            data-bs-dismiss="alert" aria-label="Close">
            <span aria-hidden="true">Accept</span>
        </button>
    </div>
}
@code {
    private IJSObjectReference? module;
    private bool showBanner = false;

    protected override async Task OnAfterRenderAsync(bool firstRender)
    {
        if (firstRender)
        {
            module = await JS.InvokeAsync<IJSObjectReference>("import",
                "./Shared/CookieConsent.razor.js");
            showBanner = !await module.InvokeAsync<bool>("getCookiePolicyAccepted");
            StateHasChanged();
        }
    }

    private async Task AcceptPolicy()
    {
        if (module is not null)
        {
            await module.InvokeVoidAsync("setCookiePolicyAccepted");
            showBanner = false;
        }
    }

    async ValueTask IAsyncDisposable.DisposeAsync()
    {
        if (module is not null)
        {
            try
            {
                await module.DisposeAsync();
            }
            catch (JSDisconnectedException)
            {
            }
        }
    }
}

Agregue el archivo JavaScript correspondiente para mantener la función en setCookiePolicyAccepted un getCookiePolicyAccepted módulo de JavaScript.

Shared/CookieConsent.razor.js:

export function getCookiePolicyAccepted() {
  const cookiePolicy = localStorage.getItem('CookiePolicyAccepted');
  return cookiePolicy === 'yes' ? true : false;
}

export function setCookiePolicyAccepted() {
  localStorage.setItem('CookiePolicyAccepted', 'yes');
}

En el ejemplo anterior, puede cambiar el nombre del elemento de almacenamiento local y el valor de "CookiePolicyAccepted" y "yes" a los valores preferidos. Si cambia uno o ambos valores, actualice ambas funciones.

Dentro del marcado <main>Razor del componente MainLayout (Layout/MainLayout.razor), agregue el componente CookieConsent.

<CookieConsent />

Recursos adicionales