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

Von Rick Anderson

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

  • Die Projektvorlagen umfassen Erweiterungspunkte und stubbed Markups, die Sie durch Ihre Datenschutz- und cookie Nutzungsrichtlinie ersetzen können.
  • Die Pages/Privacy.cshtml Seite oder Views/Home/Privacy.cshtml Ansicht bietet eine Seite, um die Datenschutzrichtlinie Ihrer Website zu detailieren.

Um das Standard-Zustimmungsfeature cookie wie in den vorlagen ASP.NET Core 2.2 in einer aktuellen ASP.NET Core generierten Vorlage zu aktivieren, fügen Sie den folgenden hervorgehobenen Code hinzuProgram.cs:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.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;
});

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Im vorhergehenden Code und CookiePolicyOptionsUseCookiePolicy wird verwendet.

  • Fügen Sie die cookie Zustimmung teilweise zur _Layout.cshtml Datei 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; 2022 - WebGDPR - <a asp-area="" asp-page="/Privacy">Privacy</a>
            </div>
        </footer>
    
        <script src="~/lib/jquery/dist/jquery.min.js"></script>
        <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
        <script src="~/js/site.js" asp-append-version="true"></script>
    
        @await RenderSectionAsync("Scripts", required: false)
    </body>
    </html>
    
  • Fügen Sie die _CookieConsentPartial.cshtml Datei zum Projekt 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 das Zustimmungsfeature zu cookie lesen.

Geben Sie den Wert an, der zum Nachverfolgen verwendet wird, wenn der Benutzer der Verwendungsrichtlinie mit der cookieCookiePolicyOptions.ConsentCookieValue Eigenschaft zugestimmt hat:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.Configure<CookiePolicyOptions>(options =>
{
    options.CheckConsentNeeded = context => true;
    options.MinimumSameSitePolicy = SameSiteMode.None;
    options.ConsentCookieValue = "true";
});

var app = builder.Build();
  • Die Projektvorlagen umfassen Erweiterungspunkte und stubbed Markups, die Sie durch Ihre Datenschutz- und cookie Nutzungsrichtlinie ersetzen können.
  • Die Pages/Privacy.cshtml Seite oder Views/Home/Privacy.cshtml Ansicht bietet eine Seite, um die Datenschutzrichtlinie Ihrer Website zu detailieren.

Um das Standard-Zustimmungsfeature cookie wie in den vorlagen ASP.NET Core 2.2 in einer aktuellen ASP.NET Core generierten Vorlage zu aktivieren, fügen Sie den folgenden hervorgehobenen Code hinzuProgram.cs:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.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;
});

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

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

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Im vorhergehenden Code und CookiePolicyOptionsUseCookiePolicy wird verwendet.

  • Fügen Sie die cookie Zustimmung teilweise zur _Layout.cshtml Datei 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; 2022 - WebGDPR - <a asp-area="" asp-page="/Privacy">Privacy</a>
            </div>
        </footer>
    
        <script src="~/lib/jquery/dist/jquery.min.js"></script>
        <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
        <script src="~/js/site.js" asp-append-version="true"></script>
    
        @await RenderSectionAsync("Scripts", required: false)
    </body>
    </html>
    
  • Fügen Sie die _CookieConsentPartial.cshtml Datei zum Projekt 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 das Zustimmungsfeature zu cookie lesen.

  • Die Projektvorlagen umfassen Erweiterungspunkte und stubbed Markups, die Sie durch Ihre Datenschutz- und cookie Nutzungsrichtlinie ersetzen können.
  • Die Pages/Privacy.cshtml Seite oder Views/Home/Privacy.cshtml Ansicht bietet eine Seite, um die Datenschutzrichtlinie Ihrer Website zu detailieren.

So aktivieren Sie das Standard-Zustimmungsfeature cookie wie im ASP.NET Core 2.2-Vorlagen in einer aktuellen ASP.NET Core generierten App:

  • Fügen Sie zur Liste der Verwendungsrichtlinien hinzu using Microsoft.AspNetCore.Http .

  • Hinzufügen CookiePolicyOptions zu Startup.ConfigureServices und UseCookiePolicy zu 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 cookie Zustimmung teilweise zur _Layout.cshtml Datei 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 der Projektdatei _ConsentPartial.cshtml die Datei "_CookieConsentPartial.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 das Zustimmungsfeature zu cookie lesen.

  • Die Projektvorlagen umfassen Erweiterungspunkte und stubbed Markups, die Sie durch Ihre Datenschutz- und cookie Nutzungsrichtlinie ersetzen können.
  • Ein cookie Zustimmungsfeature ermöglicht Es Ihnen, die Zustimmung Ihrer Benutzer zu bitten, persönliche Informationen zu speichern. Wenn ein Benutzer nicht der Datensammlung zugestimmt hat und die App CheckConsentNeededtrueauf festgelegt ist, werden nicht wesentliche cookieS nicht an den Browser gesendet.
  • Cookies kann als wichtig gekennzeichnet werden. Wesentliche Elemente cookiewerden auch dann an den Browser gesendet, wenn der Benutzer nicht zugestimmt hat und die Nachverfolgung deaktiviert ist.
  • TempData und Sessions cookie funktionieren nicht, wenn die Nachverfolgung deaktiviert ist.
  • Die Identity Verwaltungsseite bietet einen Link zum Herunterladen und Löschen von Benutzerdaten.

Mit der Beispiel-App können Sie die meisten DER DSGVO-Erweiterungspunkte und APIs testen, die ASP.NET Core 2.1-Vorlagen hinzugefügt wurden. Weitere Informationen finden Sie in der ReadMe-Datei zum Testen von Anweisungen.

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 folgenden DSGVO-Unterstützung:

  • CookiePolicyOptions und UseCookiePolicy sind in der Startup Klasse festgelegt.
  • Die Teilansicht_CookieConsentPartial.cshtml. Eine Schaltfläche "Annehmen " ist in dieser Datei enthalten. Wenn der Benutzer auf die Schaltfläche "Annehmen " klickt, wird die Zustimmung zum Speichern cookiebereitgestellt.
  • Die Pages/Privacy.cshtml Seite oder Views/Home/Privacy.cshtml Ansicht bietet eine Seite, um die Datenschutzrichtlinie Ihrer Website zu detailieren. Die Datei "_CookieConsentPartial.cshtml " generiert einen Link zur Privacy Seite.
  • Für Apps, die mit einzelnen Benutzerkonten erstellt wurden, bietet die Seite "Verwalten" Links zum Herunterladen und Löschen personenbezogener Benutzerdaten.

CookiePolicyOptions und VerwendenCookievon Richtlinien

CookiePolicyOptions werden 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 wird aufgerufen 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

Die Teilansicht _CookieConsentPartial.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 für die Zustimmung konfiguriert ist, muss der Benutzer zustimmen, bevor cookies nachverfolgt werden kann. Wenn die Zustimmung erforderlich ist, wird der cookie Zustimmungsbereich oben auf der Navigationsleiste festgelegt, die von der datei _Layout.cshtml erstellt wurde.
  • Stellt ein HTML-Element <p> bereit, um Ihre Datenschutz- und cookie Nutzungsrichtlinie zusammenzufassen.
  • Stellt einen Link zu Privacy Seite oder Ansicht bereit, in der Sie die Datenschutzrichtlinie Ihrer Website detailieren können.

Grundlegendes cookie

Wenn die Zustimmung zum Speichern cookienicht bereitgestellt wurde, werden nur die cookiemarkierten Wesentlichen an den Browser gesendet. Der folgende Code macht einen cookie wesentlichen Schlüssel:

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 Sitzungsstatus cookiesind nicht wichtig

Der TempData-Anbietercookie ist nicht wichtig. 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 die TempData cookie als wichtig 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;
});

Sitzungsstatuscookie s sind nicht wichtig. Der Sitzungsstatus ist nicht funktionsfähig, wenn die Nachverfolgung deaktiviert ist. Der folgende Code macht cookiedie Sitzung wesentlich:

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 aus, und wählen Sie dann persönliche Daten aus:

Seite

Hinweise:

  • Informationen zum Generieren des Account/Manage Codes finden Sie unter Gerüst Identity.
  • Die Links "Löschen " und " Herunterladen " wirken nur auf die Standardidentitätsdaten. Apps, die benutzerdefinierte Benutzerdaten erstellen, müssen erweitert werden, um die benutzerdefinierten Benutzerdaten zu löschen/herunterzuladen. Weitere Informationen finden Sie unter Hinzufügen, Herunterladen und Löschen benutzerdefinierter Benutzerdaten zu Identity.
  • Gespeicherte Token für den Benutzer, die in der Identity Datenbanktabelle AspNetUserTokens gespeichert sind, werden gelöscht, wenn der Benutzer über das Cascading Delete-Verhalten aufgrund des Fremdschlüssels gelöscht wird.
  • Die externe Anbieterauthentifizierung, z. B. Facebook und Google, ist nicht verfügbar, bevor die cookie Richtlinie akzeptiert wird.

Verschlüsselung ruhender Daten

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

  • Verschlüsselt gespeicherte Daten automatisch.
  • Verschlüsselt ohne Konfiguration, Programmierung oder andere Arbeiten für die Software, die auf die Daten zugreift.
  • Ist die einfachste und sicherste Option.
  • Ermöglicht es der Datenbank, Schlüssel und Verschlüsselung zu verwalten.

Beispiel:

Für Datenbanken, die keine integrierte Verschlüsselung zur Verfügung stellen, können Sie möglicherweise Datenträgerverschlüsselung verwenden, um denselben Schutz bereitzustellen. Beispiel:

Zusätzliche Ressourcen