欧盟一般数据保护条例(GDPR)在 ASP.NET Core 中的支持 Blazor

注意

这不是本文的最新版本。 对于当前版本,请参阅本文的 .NET 9 版本

警告

不再支持此版本的 ASP.NET Core。 有关详细信息,请参阅 .NET 和 .NET Core 支持策略。 对于当前版本,请参阅本文的 .NET 9 版本

重要

此信息与在商业发布之前可能进行大幅修改的预发布产品有关。 Microsoft对此处提供的信息不作任何明示或暗示的保证。

对于当前版本,请参阅本文的 .NET 9 版本

本文介绍如何实施对 欧盟一般数据保护条例(GDPR) 要求的支持。

Program 文件中:

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

    options.MinimumSameSitePolicy = SameSiteMode.None;
});

builder.Services.AddHttpContextAccessor();

在调用 MapRazorComponents之前 Program 文件中,通过调用 UseCookiePolicy添加 Cookie 策略中间件:

在调用 MapBlazorHub之前 Program 文件中,通过调用 UseCookiePolicy添加 Cookie 策略中间件:

app.UseCookiePolicy();

添加以下 CookieConsent 组件来处理 cookie 策略同意。

该组件使用 并置的 JavaScript 文件(名为 CookieConsent.razor.js)来加载模块。 确认或调整 OnAfterRenderAsync 方法中并置文件的路径。 以下组件假定组件及其配套 JavaScript 文件位于应用的 Components 文件夹中。

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)
            {
            }
        }
    }
}

添加以下 并置的 JavaScript 文件,以维护 JavaScript 模块中的 acceptPolicy 函数。

CookieConsent.razor.js

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

MainLayout 组件(MainLayout.razor)的 <main>Razor 标记中,添加 CookieConsent 组件:

<CookieConsent />

通过将自定义字符串分配给 CookiePolicyOptions.ConsentCookieValue来指定 cookie 同意值。 以下示例将默认值“yes”更改为“true”:

options.ConsentCookieValue = "true";

在 Blazor WebAssembly 应用中,本地存储 是维护用户接受站点 cookie 策略的便捷方法。 以下方法演示了该方法。

如果应用还没有共享组件的 Shared 文件夹,请将 Shared 文件夹添加到应用。

将共享组件的命名空间添加到 _Imports.razor 文件中。 在以下示例中,应用的命名空间 BlazorSample,共享文件夹的命名空间 BlazorSample.Shared

@using BlazorSample.Shared

添加以下 CookieConsent 组件来处理 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)
            {
            }
        }
    }
}

添加以下 并置的 JavaScript 文件,以维护 JavaScript 模块中的 setCookiePolicyAcceptedgetCookiePolicyAccepted 函数。

Shared/CookieConsent.razor.js

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

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

在前面的示例中,可以将本地存储项的名称和值从“CookiePolicyAccepted”和“yes”更改为任何首选值。 如果更改一个或两个值,请更新这两个函数。

MainLayout 组件(Layout/MainLayout.razor)的 <main>Razor 标记中,添加 CookieConsent 组件:

<CookieConsent />

其他资源