次の方法で共有


ASP.NET Core での EU の一般データ保護規制 (GDPR) のサポートBlazor

メモ

これは、この記事の最新バージョンではありません。 現在のリリースについては、この記事の .NET 9 バージョンを参照してください。

警告

このバージョンの ASP.NET Core はサポートされなくなりました。 詳細については、「.NET および .NET Core サポート ポリシー」を参照してください。 現在のリリースについては、この記事の .NET 9 バージョンを参照してください。

重要

この情報はリリース前の製品に関する事項であり、正式版がリリースされるまでに大幅に変更される可能性があります。 Microsoft はここに示されている情報について、明示か黙示かを問わず、一切保証しません。

現在のリリースについては、この記事の .NET 9 バージョンを参照してください。

この記事では、EU 一般データ保護規則 (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();

cookie ポリシー同意を処理するには、次の CookieConsent コンポーネントを追加します。

コンポーネントは、CookieConsent.razor.js という名前の併置された 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 ファイルを追加して、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

cookie ポリシー同意を処理するには、次の CookieConsent コンポーネントを追加します。

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 />

その他の技術情報