Europa Allgemein Datenschutz-Grundverordnung (DSGVO)-Unterstützung in ASP.NET CoreEU General Data Protection Regulation (GDPR) support in ASP.NET Core

Von Rick AndersonBy Rick Anderson

ASP.NET Core bietet APIs und Vorlagen, um einige der erfüllen die Europa Allgemein Datenschutz-Grundverordnung (DSGVO) Anforderungen:ASP.NET Core provides APIs and templates to help meet some of the EU General Data Protection Regulation (GDPR) requirements:

  • Die Projektvorlagen enthalten Erweiterungspunkte und liegenden ereignisfelds Markup, das Sie durch den Datenschutz und Cookies verwenden von Richtlinien ersetzen können.The project templates include extension points and stubbed markup that you can replace with your privacy and cookie use policy.
  • Die Pages/Privacy.cshtml Seite oder Views/Home/Privacy.cshtml Ansicht bietet eine Seite Ihrer Website-Datenschutzrichtlinie ausführlich beschrieben.The Pages/Privacy.cshtml page or Views/Home/Privacy.cshtml view provides a page to detail your site's privacy policy.

Um die Cookie-Zustimmung Standardfeature, zu aktivieren, die in die ASP.NET Core-2.2-Vorlagen in einer ASP.NET Core 3.0 generierte Vorlage app gefunden werden: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:

  • Hinzufügen CookiePolicyOptions zu Startup.ConfigureServices und UseCookiePolicy zu Startup.Configure:Add CookiePolicyOptions too 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();
            });
        }
    }
    
  • Fügen Sie die Zustimmung teilweise Cookie, um die "_Layout.cshtml" Datei: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>
    
    
  • Hinzufügen der _CookieConsentPartial.cshtml Datei zum Projekt: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>
    }
    
  • Wählen Sie die ASP.NET Core-2.2-Version dieses Artikels zum Feature Zustimmung Cookie gelesen.Select the ASP.NET Core 2.2 version of this article to read about the cookie consent feature.

  • Die Projektvorlagen enthalten Erweiterungspunkte und liegenden ereignisfelds Markup, das Sie durch den Datenschutz und Cookies verwenden von Richtlinien ersetzen können.The project templates include extension points and stubbed markup that you can replace with your privacy and cookie use policy.
  • Ein Cookie Zustimmung-Feature können Sie Ihre Zustimmung anfordern (und Nachverfolgen) von Ihren Benutzern zum Speichern von persönlichen Informationen.A cookie consent feature allows you to ask for (and track) consent from your users for storing personal information. Wenn ein Benutzer noch nicht, um die Datensammlung zugestimmt und die app verfügt über CheckConsentNeeded festgelegt true, nicht unbedingt Cookies werden nicht an den Browser gesendet.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.
  • Cookies können als wichtig markiert werden.Cookies can be marked as essential. Wichtige Cookies werden an den Browser gesendet, selbst wenn der Benutzer noch nicht zugestimmt hat und nachverfolgung ist deaktiviert.Essential cookies are sent to the browser even when the user hasn't consented and tracking is disabled.
  • TempData und Sitzungscookies nicht funktionsfähig sind, bei der Überwachung deaktiviert ist.TempData and Session cookies aren't functional when tracking is disabled.
  • Die identitätsverwaltung Seite enthält einen Link zum Herunterladen und Löschen von Daten des Benutzers.The Identity manage page provides a link to download and delete user data.

Die Beispiel-app können Sie testen, die meisten der DSGVO Erweiterungspunkte und APIs hinzugefügt, um die Vorlagen für ASP.NET Core 2.1.The sample app allows you test most of the GDPR extension points and APIs added to the ASP.NET Core 2.1 templates. Finden Sie unter den Infodatei -Datei zum Testen von Anweisungen.See the ReadMe file for testing instructions.

Anzeigen oder Herunterladen von Beispielcode (Vorgehensweise zum Herunterladen)View or download sample code (how to download)

ASP.NET Core DSGVO unterstützen, in der Vorlage generierten CodesASP.NET Core GDPR support in template-generated code

Razor-Seiten und MVC-Projekte erstellt, die mit den Projektvorlagen enthalten die folgende DSGVO-Unterstützung:Razor Pages and MVC projects created with the project templates include the following GDPR support:

  • CookiePolicyOptions und UseCookiePolicy in festgelegt sind das Startup Klasse.CookiePolicyOptions and UseCookiePolicy are set in the Startup class.
  • Die _CookieConsentPartial.cshtml Teilansicht.The _CookieConsentPartial.cshtml partial view. Ein Accept Schaltfläche befindet sich in dieser Datei.An Accept button is included in this file. Klickt der Benutzer die Accept Schaltfläche, die zum Speichern von Cookies zustimmen wird bereitgestellt.When the user clicks the Accept button, consent to store cookies is provided.
  • Die Pages/Privacy.cshtml Seite oder Views/Home/Privacy.cshtml Ansicht bietet eine Seite Ihrer Website-Datenschutzrichtlinie ausführlich beschrieben.The Pages/Privacy.cshtml page or Views/Home/Privacy.cshtml view provides a page to detail your site's privacy policy. Die _CookieConsentPartial.cshtml -Datei generiert einen Link zu die "Datenschutz".The _CookieConsentPartial.cshtml file generates a link to the Privacy page.
  • Für apps, die mit individuellen Benutzerkonten erstellt werden, bietet der Seite "verwalten" Links zum Herunterladen und Löschen von persönliche Benutzerdaten.For apps created with individual user accounts, the Manage page provides links to download and delete personal user data.

CookiePolicyOptions und UseCookiePolicyCookiePolicyOptions and UseCookiePolicy

CookiePolicyOptions initialisiert werden 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 unter "lautet" 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.cshtml Teilansicht_CookieConsentPartial.cshtml partial view

Die _CookieConsentPartial.cshtml Teilansicht: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>
}

Diese partielle:This partial:

  • Ruft den Status der Überwachung für den Benutzer ab.Obtains the state of tracking for the user. Wenn die app konfiguriert ist, um die Zustimmung erforderlich ist, muss der Benutzer zustimmen, bevor Cookies nachverfolgt werden können.If the app is configured to require consent, the user must consent before cookies can be tracked. Wenn Zustimmung erforderlich ist, das Cookie Zustimmung der Bereiche am oberen Rand der Navigationsleiste von erstellten fixiert ist die _Layout.cshtml Datei.If consent is required, the cookie consent panel is fixed at top of the navigation bar created by the _Layout.cshtml file.
  • Stellt eine HTML <p> Element, um den Datenschutz und Cookies zusammenzufassen mithilfe der Gruppenrichtlinie.Provides an HTML <p> element to summarize your privacy and cookie use policy.
  • Enthält einen Link zu "Datenschutz" oder Ansicht, in denen Sie Ihrer Website-Datenschutzrichtlinie beschreiben können.Provides a link to Privacy page or view where you can detail your site's privacy policy.

Wichtige cookiesEssential cookies

Wenn Zustimmung zum Speichern von Cookies wurde nicht angegeben wurde, nur Cookies, die als wichtig markiert werden an den Browser gesendet.If consent to store cookies hasn't been provided, only cookies marked essential are sent to the browser. Im folgenden Code werden einen Cookie wichtig: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-Anbieter und -Status-Sitzungscookies haben keine BedeutungTempData provider and session state cookies aren't essential

Die TempData-Anbieters Cookie nicht wichtig ist.The TempData provider cookie isn't essential. Wenn die Überwachung deaktiviert ist, nicht der TempData-Anbieter.If tracking is disabled, the TempData provider isn't functional. Um der TempData-Anbieter aktivieren, wenn die nachverfolgung deaktiviert ist, Markieren des TempData-Cookies als wesentlich 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;
});

Sitzungsstatus Cookies sind nicht wichtig.Session state cookies are not essential. Sitzungsstatus nicht funktionsfähig, wenn die nachverfolgung deaktiviert ist.Session state isn't functional when tracking is disabled. Im folgenden Code werden die Sitzungscookies wichtig:The following code makes session cookies essential:

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

Personenbezogene DatenPersonal data

Mit einzelnen Benutzerkonten erstellten ASP.NET Core-apps enthalten Code zum Herunterladen und Löschen von personenbezogenen Daten.ASP.NET Core apps created with individual user accounts include code to download and delete personal data.

Wählen Sie den Benutzernamen ein, und wählen Sie dann personenbezogene Daten:Select the user name and then select Personal data:

Verwalten personenbezogener Daten (Seite)

Notizen:Notes:

  • Zum Generieren der Account/Manage programmieren, finden Sie unter Gerüst Identität.To generate the Account/Manage code, see Scaffold Identity.
  • Die löschen und herunterladen Links dienen nur auf den Standard-Identity-Daten.The Delete and Download links only act on the default identity data. Apps, die benutzerdefinierten Daten zu erstellen, müssen zum Löschen und die benutzerdefinierten Benutzerdaten herunterladen erweitert werden.Apps that create custom user data must be extended to delete/download the custom user data. Weitere Informationen finden Sie unter hinzufügen, herunterladen und Löschen von benutzerdefinierten Daten Identität.For more information, see Add, download, and delete custom user data to Identity.
  • Gespeicherte Token für den Benutzer, die in der Identity-Datenbanktabelle gespeichert sind AspNetUserTokens werden gelöscht, wenn der Benutzer, über das kaskadierende Delete Verhalten aufgrund gelöscht wird der Fremdschlüssel.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.
  • Authentifizierung des externen Anbieter, z. B. Facebook und Google, nicht zur Verfügung, bevor die Cookierichtlinie akzeptiert wird.External provider authentication, such as Facebook and Google, isn't available before the cookie policy is accepted.

Verschlüsselung ruhender DatenEncryption at rest

Einige Datenbanken und andere Speichermechanismen ermöglichen die Verschlüsselung im Ruhezustand.Some databases and storage mechanisms allow for encryption at rest. Verschlüsselung ruhender Daten:Encryption at rest:

  • Gespeicherte Daten verschlüsselt automatisch.Encrypts stored data automatically.
  • Verschlüsselt, ohne Konfiguration, Programmierung oder andere Aufgaben für die Software, die die Daten zugreift.Encrypts without configuration, programming, or other work for the software that accesses the data.
  • Ist die einfachste und sicherste Option.Is the easiest and safest option.
  • Kann die Datenbank Verwalten von Schlüsseln und Verschlüsselung.Allows the database to manage keys and encryption.

Zum Beispiel:For example:

Für Datenbanken, die integrierte Verschlüsselung ruhender Daten nicht bereitstellen, können Sie datenträgerverschlüsselung zu verwenden, um den gleichen Schutz bereitstellen können.For databases that don't provide built-in encryption at rest, you may be able to use disk encryption to provide the same protection. Zum Beispiel:For example:

Zusätzliche RessourcenAdditional resources