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.

cookieASP.NET Core 3.0 テンプレートで生成されたアプリの ASP.NET Core 2.2 テンプレートにあるような既定の同意機能を有効にするには、次のようにします。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 Microsoft.AspNetCore.HttpUsing ディレクティブのリストにを追加します。Add using Microsoft.AspNetCore.Http to the list of using directives.

  • Cookie policyoptionsを追加 Startup.ConfigureServices し、 Cookie ポリシーを使用して次のことを 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同意部分を _Layout ファイルに追加します。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>
    
    
  • _ Cookie Conの部分的 なファイルをプロジェクトに追加します。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>
    }
    
  • 同意機能については、この記事の ASP.NET Core 2.2 バージョンを参照して cookie ください。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 と Session cookie sは機能しません。TempData and Session cookies aren't functional when tracking is disabled.
  • [ Identity 管理] ページには、ユーザーデータをダウンロードおよび削除するためのリンクが用意されています。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 プロジェクトテンプレートで作成されたページと MVC プロジェクトには、次の GDPR サポートが含まれます。Razor Pages and MVC projects created with the project templates include the following GDPR support:

  • Cookie PolicyoptionsUse Cookie policyは、クラスで設定され Startup ます。CookiePolicyOptions and UseCookiePolicy are set in the Startup class.
  • _ Cookie Conの 部分的な部分 ビューThe _CookieConsentPartial.cshtml partial view. このファイルには、[ Accept ] ボタンが含まれています。An Accept button is included in this file. ユーザーが [ 同意 する] ボタンをクリックすると、store s に同意したことに 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. _ Cookie Con/partial ファイルは、プライバシーページへのリンクを生成します。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 と Use Cookie policyCookiePolicyOptions and UseCookiePolicy

Cookie Policyoptionsは次のもので初期化され 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();
    }
}

使用 Cookieポリシー は次のもので呼び出され 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();
    }
}

_CookieConの部分的な部分ビューの表示_CookieConsentPartial.cshtml partial view

_ Cookie Conの 部分的な部分ビューは次のようになります。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.
  • <p>プライバシーを要約し、ポリシーを使用するための HTML 要素が用意されて cookie います。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 s のみがブラウザーに送信されます。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 provider と session state s は必須ではあり 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 プロバイダーを有効にするには、次のように TempData を cookie 必須としてマークし Startup.ConfigureServices ます。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. 詳細については、「カスタムユーザーデータの追加、ダウンロード、 Identity および削除」を参照してください。For more information, see Add, download, and delete custom user data to Identity.
  • データベーステーブルに格納されているユーザーの保存済みトークン Identity 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.
  • Facebook や Google などの外部プロバイダー認証は、ポリシーを受け入れる前に使用できません cookie 。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