Compartir a través de


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

Nota:

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

Advertencia

Esta versión de ASP.NET Core ya no se admite. 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 de .NET 9 de este artículo.

Importante

Esta información hace referencia a un producto en versión preliminar, el cual puede sufrir importantes modificaciones antes de que se publique la versión comercial. Microsoft no proporciona ninguna garantía, expresa o implícita, con respecto a la información proporcionada aquí.

Para la versión actual, consulte la versión de .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, agregue Cookie Policy Middleware 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 de 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 BlazorSample y 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 que prefiera. Si cambia uno o ambos valores, actualice ambas funciones.

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

<CookieConsent />

Recursos adicionales