ASP.NET Core での EU 一般データ保護規則 (GDPR) のサポートEU General Data Protection Regulation (GDPR) support in ASP.NET Core

作成者: Rick AndersonBy Rick Anderson

ASP.NET Core には、いくつかのEU 一般データ保護規則 (GDPR)の要件を満たすのに役立つAPIとテンプレートが用意されています。ASP.NET Core provides APIs and templates to help meet some of the EU General Data Protection Regulation (GDPR) requirements:

  • プロジェクトテンプレートには、拡張ポイントとスタブマークアップが含まれています。これは、プライバシーと cookie の使用ポリシーに置き換えることができます。The project templates include extension points and stubbed markup that you can replace with your privacy and cookie use policy.
  • Pages/privacy. cshtmlページまたはViews/Home/privacyビューには、サイトのプライバシーポリシーを詳細に説明するページが用意されています。The Pages/Privacy.cshtml page or Views/Home/Privacy.cshtml view provides a page to detail your site's privacy policy.

ASP.NET Core 3.0 テンプレートで生成されたアプリの ASP.NET Core 2.2 テンプレートにあるような既定の cookie 同意機能を有効にするには、次のようにします。To enable the default cookie consent feature like that found in the ASP.NET Core 2.2 templates in an ASP.NET Core 3.0 template generated app:

  • Using using Microsoft.AspNetCore.Httpディレクティブのリストにを追加します。Add using Microsoft.AspNetCore.Http to the list of using directives.

  • CookiepolicyoptionsStartup.ConfigureServicesUseCookiePolicy Startup.Configureに追加します。Add CookiePolicyOptions to Startup.ConfigureServices and UseCookiePolicy to Startup.Configure:

    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }
    
        public IConfiguration Configuration { get; }
    
        public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<CookiePolicyOptions>(options =>
            {
                // This lambda determines whether user consent for non-essential 
                // cookies is needed for a given request.
                options.CheckConsentNeeded = context => true;
                // requires using Microsoft.AspNetCore.Http;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });
    
            services.AddRazorPages();
        }
    
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Error");
                app.UseHsts();
            }
    
            app.UseHttpsRedirection();
            app.UseStaticFiles();
            app.UseCookiePolicy();
    
            app.UseRouting();
    
            app.UseAuthorization();
    
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapRazorPages();
            });
        }
    }
    
  • 次のように、cookie の同意を部分的なファイルに追加します Add the cookie consent partial to the _Layout.cshtml file:

            @*Previous markup removed for brevity*@
        </header>
        <div class="container">
            <partial name="_CookieConsentPartial" />
            <main role="main" class="pb-3">
                @RenderBody()
            </main>
        </div>
    
        <footer class="border-top footer text-muted">
            <div class="container">
                &copy; 2019 - RPCC - <a asp-area="" asp-page="/Privacy">Privacy</a>
            </div>
        </footer>
    
        <script src="~/lib/jquery/dist/jquery.js"></script>
        <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.js"></script>
        <script src="~/js/site.js" asp-append-version="true"></script>
    
        @RenderSection("Scripts", required: false)
    </body>
    </html>
    
    
  • CookieConsentPartial ファイルをプロジェクトに追加します。 _Add the _CookieConsentPartial.cshtml file to the project:

    @using Microsoft.AspNetCore.Http.Features
    
    @{
        var consentFeature = Context.Features.Get<ITrackingConsentFeature>();
        var showBanner = !consentFeature?.CanTrack ?? false;
        var cookieString = consentFeature?.CreateConsentCookie();
    }
    
    @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 asp-page="/Privacy">Learn More</a>.
            <button type="button" class="accept-policy close" data-dismiss="alert" aria-label="Close" data-cookie-string="@cookieString">
                <span aria-hidden="true">Accept</span>
            </button>
        </div>
        <script>
            (function () {
                var button = document.querySelector("#cookieConsent button[data-cookie-string]");
                button.addEventListener("click", function (event) {
                    document.cookie = button.dataset.cookieString;
                }, false);
            })();
        </script>
    }
    
  • Cookie の同意機能については、この記事の ASP.NET Core 2.2 バージョンを選択してください。Select the ASP.NET Core 2.2 version of this article to read about the cookie consent feature.

  • プロジェクトテンプレートには、拡張ポイントとスタブマークアップが含まれています。これは、プライバシーと cookie の使用ポリシーに置き換えることができます。The project templates include extension points and stubbed markup that you can replace with your privacy and cookie use policy.
  • Cookie の同意機能を使用すると、個人情報の保存をユーザーに要求する (および追跡する) ことができます。A cookie consent feature allows you to ask for (and track) consent from your users for storing personal information. ユーザーがデータ収集に同意しておらず、アプリのcheckconがにtrue設定されている場合、必須ではない cookie はブラウザーに送信されません。If a user hasn't consented to data collection and the app has CheckConsentNeeded set to true, non-essential cookies aren't sent to the browser.
  • Cookie は、必須としてマークできます。Cookies can be marked as essential. ユーザーが同意しておらず、追跡が無効になっている場合でも、必須の cookie がブラウザーに送信されます。Essential cookies are sent to the browser even when the user hasn't consented and tracking is disabled.
  • 追跡が無効になっている場合、Tempdata とセッションクッキーは機能しません。TempData and Session cookies aren't functional when tracking is disabled.
  • [ Id 管理] ページには、ユーザーデータをダウンロードおよび削除するためのリンクが表示されます。The Identity manage page provides a link to download and delete user data.

サンプル アプリでは、ASP.NET Core 2.1 のテンプレートに追加されたほとんどの GDPR の拡張点と API をテストできます。The sample app allows you test most of the GDPR extension points and APIs added to the ASP.NET Core 2.1 templates. 詳しくは、手順のテスト用のファイルReadMeを参照してください。See the ReadMe file for testing instructions.

サンプル コードを表示またはダウンロードします (ダウンロード方法)。View or download sample code (how to download)

テンプレートで生成されたコードでの GDPR サポートの ASP.NET CoreASP.NET Core GDPR support in template-generated code

プロジェクトテンプレートで作成された Razor Pages および MVC プロジェクトには、次の GDPR サポートが含まれます。Razor Pages and MVC projects created with the project templates include the following GDPR support:

  • CookiepolicyoptionsUseCookiePolicyStartupクラスで設定されます。CookiePolicyOptions and UseCookiePolicy are set in the Startup class.
  • CookieConsentPartial 部分ビュー_The _CookieConsentPartial.cshtml partial view. このファイルには、 [Accept] ボタンが含まれています。An Accept button is included in this file. ユーザーが [同意する] ボタンをクリックすると、[cookie の保存に同意する] が表示されます。When the user clicks the Accept button, consent to store cookies is provided.
  • Pages/privacy. cshtmlページまたはViews/Home/privacyビューには、サイトのプライバシーポリシーを詳細に説明するページが用意されています。The Pages/Privacy.cshtml page or Views/Home/Privacy.cshtml view provides a page to detail your site's privacy policy. _CookieConsentPartialファイルは、プライバシーページへのリンクを生成します。The _CookieConsentPartial.cshtml file generates a link to the Privacy page.
  • 個々のユーザーアカウントで作成されたアプリの場合、[管理] ページに、個人ユーザーデータをダウンロードおよび削除するためのリンクが表示されます。For apps created with individual user accounts, the Manage page provides links to download and delete personal user data.

CookiePolicyOptions および UseCookiePolicyCookiePolicyOptions and UseCookiePolicy

Cookiepolicyoptionsは次のStartup.ConfigureServicesもので初期化されます。CookiePolicyOptions are initialized in Startup.ConfigureServices:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services 
    // to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<CookiePolicyOptions>(options =>
        {
            // This lambda determines whether user consent for non-essential cookies 
            // is needed for a given request.
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });

        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(
                Configuration.GetConnectionString("DefaultConnection")));
        services.AddDefaultIdentity<IdentityUser>()
            .AddEntityFrameworkStores<ApplicationDbContext>();

        // If the app uses session state, call AddSession.
        // services.AddSession();

        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    }

    // This method gets called by the runtime. Use this method to configure the 
    // HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseDatabaseErrorPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseCookiePolicy();

        app.UseAuthentication();

        // If the app uses session state, call Session Middleware after Cookie 
        // Policy Middleware and before MVC Middleware.
        // app.UseSession();

        app.UseMvc();
    }
}

UseCookiePolicyは次のStartup.Configureもので呼び出されます。UseCookiePolicy is called in Startup.Configure:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services 
    // to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<CookiePolicyOptions>(options =>
        {
            // This lambda determines whether user consent for non-essential cookies 
            // is needed for a given request.
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });

        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(
                Configuration.GetConnectionString("DefaultConnection")));
        services.AddDefaultIdentity<IdentityUser>()
            .AddEntityFrameworkStores<ApplicationDbContext>();

        // If the app uses session state, call AddSession.
        // services.AddSession();

        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    }

    // This method gets called by the runtime. Use this method to configure the 
    // HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseDatabaseErrorPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseCookiePolicy();

        app.UseAuthentication();

        // If the app uses session state, call Session Middleware after Cookie 
        // Policy Middleware and before MVC Middleware.
        // app.UseSession();

        app.UseMvc();
    }
}

_CookieConsentPartial 部分ビュー_CookieConsentPartial.cshtml partial view

_CookieConsentPartial部分ビューは次のとおりです。The _CookieConsentPartial.cshtml partial view:

@using Microsoft.AspNetCore.Http.Features

@{
    var consentFeature = Context.Features.Get<ITrackingConsentFeature>();
    var showBanner = !consentFeature?.CanTrack ?? false;
    var cookieString = consentFeature?.CreateConsentCookie();
}

@if (showBanner)
{
    <nav id="cookieConsent" class="navbar navbar-default navbar-fixed-top" role="alert">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#cookieConsent .navbar-collapse">
                    <span class="sr-only">Toggle cookie consent banner</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <span class="navbar-brand"><span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span></span>
            </div>
            <div class="collapse navbar-collapse">
                <p class="navbar-text">
                    Use this space to summarize your privacy and cookie use policy.
                </p>
                <div class="navbar-right">
                    <a asp-page="/Privacy" class="btn btn-info navbar-btn">Learn More</a>
                    <button type="button" class="btn btn-default navbar-btn" data-cookie-string="@cookieString">Accept</button>
                </div>
            </div>
        </div>
    </nav>
    <script>
        (function () {
            document.querySelector("#cookieConsent button[data-cookie-string]").addEventListener("click", function (el) {
                document.cookie = el.target.dataset.cookieString;
                document.querySelector("#cookieConsent").classList.add("hidden");
            }, false);
        })();
    </script>
}

この部分は次のとおりです。This partial:

  • ユーザーの追跡の状態を取得します。Obtains the state of tracking for the user. アプリが同意を要求するように構成されている場合、ユーザーは、cookie を追跡する前に同意する必要があります。If the app is configured to require consent, the user must consent before cookies can be tracked. 同意が必要な場合、cookie 同意パネルは、 _Layoutファイルによって作成されたナビゲーションバーの上部に固定されます。If consent is required, the cookie consent panel is fixed at top of the navigation bar created by the _Layout.cshtml file.
  • プライバシーと cookie <p>の使用ポリシーを要約する HTML 要素を提供します。Provides an HTML <p> element to summarize your privacy and cookie use policy.
  • サイトのプライバシーポリシーを詳細に説明する [プライバシー] ページまたはビューへのリンクを提供します。Provides a link to Privacy page or view where you can detail your site's privacy policy.

必須の cookieEssential cookies

Cookie を保存するための同意が指定されていない場合は、必須とマークされた cookie だけがブラウザーに送信されます。If consent to store cookies hasn't been provided, only cookies marked essential are sent to the browser. 次のコードでは、cookie が必要になります。The following code makes a cookie essential:

public IActionResult OnPostCreateEssentialAsync()
{
    HttpContext.Response.Cookies.Append(Constants.EssentialSec, 
        DateTime.Now.Second.ToString(), 
        new CookieOptions() { IsEssential = true });

    ResponseCookies = Response.Headers[HeaderNames.SetCookie].ToString();

    return RedirectToPage("./Index");
}

TempData プロバイダーとセッション状態の cookie は必須ではありませんTempData provider and session state cookies aren't essential

Tempdata プロバイダーの cookie は必須ではありません。The TempData provider cookie isn't essential. 追跡が無効になっている場合、TempData プロバイダーは機能しません。If tracking is disabled, the TempData provider isn't functional. 追跡が無効になっているときに TempData プロバイダーを有効にするには、 Startup.ConfigureServicestempdata cookie をに必須としてマークします。To enable the TempData provider when tracking is disabled, mark the TempData cookie as essential in Startup.ConfigureServices:

// The TempData provider cookie is not essential. Make it essential
// so TempData is functional when tracking is disabled.
services.Configure<CookieTempDataProviderOptions>(options => {
    options.Cookie.IsEssential = true;
});

セッション状態の cookie は必須ではありません。Session state cookies are not essential. 追跡が無効になっている場合、セッション状態は機能しません。Session state isn't functional when tracking is disabled. 次のコードでは、セッション cookie が不可欠になります。The following code makes session cookies essential:

services.AddSession(options =>
{
    options.Cookie.IsEssential = true;
});

個人データPersonal data

個々のユーザーアカウントで作成されたアプリには、個人データをダウンロードして削除するコードが含まれています。 ASP.NET CoreASP.NET Core apps created with individual user accounts include code to download and delete personal data.

ユーザー名を選択し、 [個人データ] を選択します。Select the user name and then select Personal data:

[個人データの管理] ページ

メモ:Notes:

  • Account/Manageコードを生成するには、「スキャフォールディング Identity」を参照してください。To generate the Account/Manage code, see Scaffold Identity.
  • [削除] リンクと [ダウンロード] リンクは、既定の id データに対してのみ機能します。The Delete and Download links only act on the default identity data. カスタムユーザーデータを作成するアプリは、カスタムユーザーデータを削除/ダウンロードするように拡張する必要があります。Apps that create custom user data must be extended to delete/download the custom user data. 詳細については、「カスタムユーザーデータを id に追加、ダウンロード、および削除する」を参照してください。For more information, see Add, download, and delete custom user data to Identity.
  • Id データベーステーブルAspNetUserTokensに格納されているユーザーの保存済みトークンは、外部キーによる連鎖削除動作によってユーザーが削除されると削除されます。Saved tokens for the user that are stored in the Identity database table AspNetUserTokens are deleted when the user is deleted via the cascading delete behavior due to the foreign key.
  • Cookie ポリシーを受け入れる前に、Facebook や Google などの外部プロバイダー認証は使用できません。External provider authentication, such as Facebook and Google, isn't available before the cookie policy is accepted.

保存時の暗号化Encryption at rest

一部のデータベースとストレージメカニズムでは、保存時の暗号化が可能です。Some databases and storage mechanisms allow for encryption at rest. 保存時の暗号化:Encryption at rest:

  • 保存されたデータを自動的に暗号化します。Encrypts stored data automatically.
  • は、データにアクセスするソフトウェアの構成、プログラミング、またはその他の作業を行わずに暗号化します。Encrypts without configuration, programming, or other work for the software that accesses the data.
  • は最も簡単で安全なオプションです。Is the easiest and safest option.
  • データベースでキーと暗号化を管理できるようにします。Allows the database to manage keys and encryption.

例:For example:

保存時の組み込みの暗号化を提供しないデータベースの場合は、ディスク暗号化を使用して同じ保護を提供できる場合があります。For databases that don't provide built-in encryption at rest, you may be able to use disk encryption to provide the same protection. 例:For example:

その他の技術情報Additional resources