欧盟一般数据保护条例(GDPR)在 ASP.NET Core 中的支持 Blazor
注意
这不是本文的最新版本。 对于当前版本,请参阅本文的 .NET 9 版本。
警告
不再支持此版本的 ASP.NET Core。 有关详细信息,请参阅 .NET 和 .NET Core 支持策略。 对于当前版本,请参阅本文的 .NET 9 版本。
本文介绍如何实施对 欧盟一般数据保护条例(GDPR) 要求的支持。
在 Program
文件中:
- 添加 CookiePolicyOptions 配置,要求用户同意非必要 Cookie,并将相同的站点策略设置为无。 有关详细信息,请参阅使用 ASP.NET Core 中的 SameSite Cookie。
- 通过调用 AddHttpContextAccessor添加 IHttpContextAccessor 服务的默认实现。
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 />
自定义 cookie 同意值
通过将自定义字符串分配给 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 模块中的 setCookiePolicyAccepted
和 getCookiePolicyAccepted
函数。
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 />