Поддержка общего регламента по защите данных ЕС (GDPR) в ASP.NET Core Blazor
Предупреждение
Эта версия ASP.NET Core больше не поддерживается. Дополнительные сведения см. в политике поддержки для .NET и .NET Core. Для текущего выпуска см. версию этой статьи .NET 9 .
Важный
Эта информация относится к предварительному выпуску продукта, который может быть существенно изменен до его коммерческого выпуска. Корпорация Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых в отношении информации, предоставленной здесь.
В этой статье объясняется, как реализовать поддержку требований Общего регламента по защите данных (GDPR) ЕС.
В файле Program
:
- Добавьте конфигурацию CookiePolicyOptions, чтобы требовать согласие пользователя для несущественных файлов cookie и задать для политики SameSite значение none. Дополнительные сведения см. в разделе Работа с файлами cookie SameSite в ASP.NET Core.
- Добавьте реализацию по умолчанию для службы IHttpContextAccessor путем вызова AddHttpContextAccessor.
builder.Services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
builder.Services.AddHttpContextAccessor();
В файле Program
перед вызовом MapRazorComponentsдобавьте ПО промежуточного слоя политики Cookie путем вызова UseCookiePolicy:
В файле Program
перед вызовом MapBlazorHubдобавьте ПО промежуточного слоя политики Cookie путем вызова UseCookiePolicy:
app.UseCookiePolicy();
Добавьте следующий компонент CookieConsent
для обработки согласия политики cookie.
Компонент использует-файл JavaScript с 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-файл , размещённый в, чтобы поддерживать функцию acceptPolicy
в модуле JavaScript.
CookieConsent.razor.js
:
export function acceptPolicy(cookieString) {
document.cookie = cookieString;
}
В разметке <main>
Razor компонента MainLayout
(MainLayout.razor
) добавьте компонент CookieConsent
:
<CookieConsent />
Настройка значения согласия cookie
Укажите значение согласия cookie, назначив пользовательскую строку CookiePolicyOptions.ConsentCookieValue. Следующий пример изменяет значение по умолчанию "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 для поддержания функций setCookiePolicyAccepted
и getCookiePolicyAccepted
в модуле 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');
}
В предыдущем примере можно изменить имя локального элемента хранилища и значения с "CookiePolicyAccepted
" и "yes
" на любые предпочитаемые значения. При изменении одного или обоих значений обновите обе функции.
В разметке <main>
Razor компонента MainLayout
(Layout/MainLayout.razor
) добавьте компонент CookieConsent
:
<CookieConsent />
Дополнительные ресурсы
- Центр управления безопасностью Майкрософт: защита частной конфиденциальности с помощью облачных служб от Майкрософт: GDPR
- Европейская комиссия: объяснение защиты данных
ASP.NET Core