Unterstützung der EU-Datenschutz-Grundverordnung (DSGVO) in ASP.NET Core

Von Rick Anderson

ASP.NET Core stellt APIs und Vorlagen bereit, um einige der Anforderungen der EU-Datenschutz-Grundverordnung (DSGVO) zu erfüllen:

  • Die Projektvorlagen enthalten Erweiterungspunkte und stubbed Markup, die Sie durch Ihre Datenschutz- und Nutzungsrichtlinie ersetzen cookie können.
  • Die Pages/CSHTML-Seite oder /Privacy views/.cshtml-Ansicht enthält eine Seite, auf der die Datenschutzrichtlinie Ihrer Website ausführlich beschrieben wird.

So aktivieren Sie die cookie Standardzustimmungsfunktion wie in den vorlagen ASP.NET Core 2.2 in einer ASP.NET Core 3.0-Vorlage generierten App:

  • Fügen Sie using Microsoft.AspNetCore.Http der Liste der using-Anweisungen hinzu.

  • Fügen Sie policyoptions" data-linktype="absolute-path">Cookie PolicyOptions to and cookie Startup.ConfigureServicesCookie policyappbuilderextensions.use cookie policy" data-linktype="absolute-path">Use Cookie Policy to Startup.Configure hinzu:

    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 der cookie Datei cookie die teilweise Zustimmung hinzu:

            @*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>
    
    
  • Fügen Sie dem Projekt die Datei _ ConsentPartial.cshtml hinzu:

    @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 aus, um mehr über das cookie Zustimmungsfeature zu erfahren.

  • Die Projektvorlagen enthalten Erweiterungspunkte und stubbed Markup, die Sie durch Ihre Datenschutz- und Nutzungsrichtlinie ersetzen cookie können.
  • Mit cookie einem Zustimmungsfeature können Sie Ihre Benutzer um Zustimmung zum Speichern persönlicher Informationen bitten (und nachverfolgen). Wenn ein Benutzer der Datensammlung nicht zugestimmt hat und für die App cookie policyoptions.checkconsentneeded" data-linktype="absolute-path">CheckConsentNeeded auf festgelegt true ist, werden nicht wesentliche s nicht an cookie den Browser gesendet.
  • Cookies können als "essential" markiert werden. Wichtige cookie Elemente werden auch dann an den Browser gesendet, wenn der Benutzer nicht zugestimmt hat und die Nachverfolgung deaktiviert ist.
  • TempData and Session cookies sind nicht funktionsfähig, wenn die Nachverfolgung deaktiviert ist.
  • Die Identity manage Seite enthält einen Link zum Herunterladen und Löschen von Benutzerdaten.

Mit der Beispiel-App können Sie die meisten DSGVO-Erweiterungspunkte und APIs testen, die den vorlagen ASP.NET Core 2.1 hinzugefügt wurden. Testanweisungen finden Sie in der ReadMe-Datei.

Anzeigen oder Herunterladen von Beispielcode (Vorgehensweise zum Herunterladen)

ASP.NET Core DSGVO-Unterstützung in vorlagengeneriertem Code

Razor Seiten und MVC-Projekte, die mit den Projektvorlagen erstellt wurden, umfassen die folgende DSGVO-Unterstützung:

  • cookie policyoptions" data-linktype="absolute-path">Cookie PolicyOptions and cookie Cookie policyappbuilderextensions.use cookie policy" data-linktype="absolute-path">Use Cookie Policy are set in the Startup class.
  • Die _ConsentPartial.cshtml-Teilansicht. Eine Schaltfläche Akzeptieren ist in dieser Datei enthalten. Wenn der Benutzer auf die Schaltfläche Akzeptieren klickt, wird die Zustimmung zum Speichern von angegeben.
  • Die Pages/CSHTML-Seite oder /Privacy views/.cshtml-Ansicht enthält eine Seite, auf der die Datenschutzrichtlinie Ihrer Website ausführlich beschrieben wird. Die Datei _ ConsentPartial.cshtml generiert einen Link zur Privacy Seite.
  • Für Apps, die mit einzelnen Benutzerkonten erstellt wurden, enthält die Seite Verwalten Links zum Herunterladen und Löschen persönlicher Benutzerdaten.

cookie policyoptions" data-linktype="absolute-path">Cookie PolicyOptions werden in initialisiert: 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 policyappbuilderextensions.use cookie policy" data-linktype="absolute-path">Cookie Use Policy 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();
    }
}

Die Teilansicht _ ConsentPartial.cshtml:

@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>
}

Dieser Teil:

  • Ruft den Status der Nachverfolgung für den Benutzer ab. Wenn die App so konfiguriert ist, dass eine Zustimmung erforderlich ist, muss der Benutzer zustimmen, bevor cookie s nachverfolgt werden können. Wenn die Zustimmung erforderlich ist, wird der cookie Zustimmungsbereich oben in der Navigationsleiste, die von der Datei cookie erstellt wurde, korrigiert.
  • Stellt ein <p> HTML-Element bereit, um Ihre Datenschutz- und Verwendungsrichtlinie zusammenzufassen. cookie
  • Stellt einen Link zur Privacy Seite oder Ansicht bereit, auf der Sie die Datenschutzrichtlinie Ihrer Website detailliert beschreiben können.

Wenn keine Zustimmung zum Speichern cookie von erteilt wurde, werden nur cookie als "essential" markierte Elemente an den Browser gesendet. Der folgende Code macht einen cookie wesentlichen Bestandteil:

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");
}

Der TempData-Anbieter ist nicht zwingend erforderlich. Wenn die Nachverfolgung deaktiviert ist, ist der TempData-Anbieter nicht funktionsfähig. Um den TempData-Anbieter zu aktivieren, wenn die Nachverfolgung deaktiviert ist, markieren Sie tempdata cookie in als Startup.ConfigureServices wichtig:

// 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;
});

Sitzungszustand s sind nicht zwingend erforderlich. Der Sitzungszustand ist nicht funktionsfähig, wenn die Nachverfolgung deaktiviert ist. Der folgende Code macht cookie sitzungswichtig:

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

Personenbezogene Daten

ASP.NET Core Apps, die mit einzelnen Benutzerkonten erstellt wurden, enthalten Code zum Herunterladen und Löschen personenbezogener Daten.

Wählen Sie den Benutzernamen und dann Personenbezogene Datenaus:

Manage personal data page

Hinweise:

  • Informationen zum Generieren des Account/Manage Codes finden Sie unter Scaffold Identity .
  • Die Links Löschen und Herunterladen wirken sich nur auf die Standardidentitätsdaten aus. Apps, die benutzerdefinierte Benutzerdaten erstellen, müssen erweitert werden, um die benutzerdefinierten Benutzerdaten zu löschen/herunterzuladen. Weitere Informationen finden Sie unter Add, download, and delete custom user data to Identity.
  • Gespeicherte Token für den Benutzer, die in der Datenbanktabelle gespeichert sind, IdentityAspNetUserTokens werden gelöscht, wenn der Benutzer über das kaskadierende Löschverhalten aufgrund der Identity Identität /blob/release/2.1/src/EF/ Identity UserContext.cs#L152" data-linktype="external">Fremdschlüssel gelöscht
wird.
  • Die Authentifizierung externer Anbieterwie Facebook und Google ist nicht verfügbar, bevor die Richtlinie akzeptiert wird.
  • Verschlüsselung ruhender Daten

    Einige Datenbanken und Speichermechanismen ermöglichen die Verschlüsselung ruher Daten. Verschlüsselung ruhender Daten:

    • Verschlüsselt gespeicherte Daten automatisch.
    • Verschlüsselt ohne Konfiguration, Programmierung oder andere Arbeit für die Software, die auf die Daten zugreift.
    • Die einfachste und sicherste Option.
    • Ermöglicht der Datenbank die Verwaltung von Schlüsseln und Verschlüsselung.

    Beispiel:

    Für Datenbanken, die keine integrierte Verschlüsselung im Ruhezustand bereitstellen, können Sie möglicherweise die Datenträgerverschlüsselung verwenden, um den gleichen Schutz zu bieten. Beispiel:

    Zusätzliche Ressourcen