Wsparcie dla ogólnego rozporządzenia o ochronie danych (RODO) w ue w ASP.NET Core
Autor: Rick Anderson
ASP.NET Core udostępnia interfejsy API i szablony ułatwiające spełnienie niektórych wymagań dotyczących ogólnego rozporządzenia o ochronie danych (RODO):
- Szablony projektów obejmują punkty rozszerzeń i stubbed markup, które można zastąpić zasadami ochrony prywatności i cookie używania.
- Strona
Pages/Privacy.cshtml
lubViews/Home/Privacy.cshtml
widok zawiera stronę zawierającą szczegółowe informacje na temat zasad zachowania poufności informacji w witrynie.
Aby włączyć domyślną cookie funkcję wyrażania zgody, na przykład znajdującą się w szablonach platformy ASP.NET Core 2.2 w bieżącym szablonie ASP.NET Core wygenerowanym przez aplikację, dodaj następujący wyróżniony kod do Program.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();
W poprzednim kodzie CookiePolicyOptions i UseCookiePolicy są używane.
cookie Dodaj wyrażenie zgody częściowe
_Layout.cshtml
do pliku:@*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"> © 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>
_CookieConsentPartial.cshtml
Dodaj plik do projektu:@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-bs-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> }
Wybierz wersję tego artykułu ASP.NET Core 2.2, aby przeczytać o funkcji wyrażania cookie zgody.
cookie Dostosowywanie wartości zgody
Określ wartość używaną do śledzenia, czy użytkownik wyraził zgodę na cookie korzystanie z zasad przy użyciu CookiePolicyOptions.ConsentCookieValue
właściwości :
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();
Szyfrowanie w spoczynku
Niektóre bazy danych i mechanizmy magazynowania umożliwiają szyfrowanie magazynowane. Szyfrowanie magazynowane:
- Szyfruje przechowywane dane automatycznie.
- Szyfruje bez konfiguracji, programowania lub innego oprogramowania, które uzyskuje dostęp do danych.
- Jest najprostszą i najbezpieczniejszą opcją.
- Umożliwia bazie danych zarządzanie kluczami i szyfrowaniem.
Przykład:
- Usługi Microsoft SQL i Azure SQL zapewniają funkcję Transparent Data Encryption (TDE).
- Usługi SQL Azure domyślnie szyfruje bazę danych
- Usługi Azure Blob, Files, Table i Queue Storage są domyślnie szyfrowane.
W przypadku baz danych, które nie zapewniają wbudowanego szyfrowania magazynowanych, może być możliwe użycie szyfrowania dysków w celu zapewnienia tej samej ochrony. Przykład:
Dodatkowe zasoby
- Szablony projektów obejmują punkty rozszerzeń i stubbed markup, które można zastąpić zasadami ochrony prywatności i cookie używania.
- Funkcja wyrażania cookie zgody umożliwia prośbę o zgodę (i śledzenie) od użytkowników w celu przechowywania danych osobowych. Jeśli użytkownik nie wyraził zgody na zbieranie danych, a aplikacja CheckConsentNeeded ma ustawioną wartość
true
, nie są cookiewysyłane do przeglądarki. - Cookies można oznaczyć jako niezbędne. Podstawowe cookieelementy są wysyłane do przeglądarki nawet wtedy, gdy użytkownik nie wyraził zgody i śledzenie jest wyłączone.
- Pliki TempData i Session cookie nie działają, gdy śledzenie jest wyłączone.
- Strona Identity zarządzania udostępnia link do pobierania i usuwania danych użytkownika.
Przykładowa aplikacja umożliwia przetestowanie większości punktów rozszerzeń RODO i interfejsów API dodanych do szablonów platformy ASP.NET Core 2.1. Aby uzyskać instrukcje dotyczące testowania , zobacz plik ReadMe .
Wyświetl lub pobierz przykładowy kod (jak pobrać)
obsługa ASP.NET Core RODO w kodzie wygenerowanym przez szablon
Razor Strony i projekty MVC utworzone za pomocą szablonów projektu obejmują następującą obsługę RODO:
- CookiePolicyOptions i UseCookiePolicy są ustawiane w
Startup
klasie . - Widok częściowy _CookieConsentPartial.cshtml. W tym pliku znajduje się przycisk Akceptuj . Gdy użytkownik kliknie przycisk Akceptuj , zostanie udzielona zgoda na przechowywanie cookieplików.
- Strona
Pages/Privacy.cshtml
lubViews/Home/Privacy.cshtml
widok zawiera stronę zawierającą szczegółowe informacje na temat zasad zachowania poufności informacji w witrynie. Plik _CookieConsentPartial.cshtml generuje link do Privacy strony. - W przypadku aplikacji utworzonych przy użyciu indywidualnych kont użytkowników strona Zarządzanie zawiera linki do pobierania i usuwania danych użytkownika osobistego.
CookieZasadyOpcje i używanieCookiezasad
CookiePolicyOptions są inicjowane w pliku 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 jest wywoływana w pliku 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 — widok częściowy
Widok częściowy _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>
}
To częściowe:
- Uzyskuje stan śledzenia dla użytkownika. Jeśli aplikacja jest skonfigurowana tak, aby wymagała zgody, użytkownik musi wyrazić zgodę, zanim cookiebędzie można śledzić te ustawienia. Jeśli jest wymagana zgoda, cookie panel zgody jest stały u góry paska nawigacyjnego utworzonego przez plik _Layout.cshtml .
- Udostępnia element HTML
<p>
do podsumowania prywatności i cookie używania zasad. - Zawiera link do Privacy strony lub widoku, w którym można szczegółowo określić zasady ochrony prywatności witryny.
Podstawowe cookies
Jeśli nie podano zgody na przechowywanie cookie, do przeglądarki są wysyłane tylko cookieoznaczone istotne elementy. Poniższy kod ma cookie zasadnicze znaczenie:
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");
}
Dostawca tempData i stan cookiesesji nie są niezbędne
Dostawca cookie TempData nie jest niezbędny. Jeśli śledzenie jest wyłączone, dostawca TempData nie działa. Aby włączyć dostawcę TempData podczas śledzenia jest wyłączona, oznacz wartość TempData cookie jako niezbędną w pliku 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;
});
Stanycookiesesji nie są niezbędne. Stan sesji nie działa, gdy śledzenie jest wyłączone. Poniższy kod sprawia, że sesja cookiejest niezbędna:
services.AddSession(options =>
{
options.Cookie.IsEssential = true;
});
Dane osobiste
aplikacje ASP.NET Core utworzone przy użyciu poszczególnych kont użytkowników zawierają kod umożliwiający pobieranie i usuwanie danych osobowych.
Wybierz nazwę użytkownika, a następnie wybierz pozycję Dane osobowe:
Uwagi:
- Aby wygenerować
Account/Manage
kod, zobacz Szkielet Identity. - Łącza Usuń i Pobierz działają tylko na domyślnych danych tożsamości. Aplikacje, które tworzą niestandardowe dane użytkownika, muszą zostać rozszerzone w celu usunięcia/pobrania niestandardowych danych użytkownika. Aby uzyskać więcej informacji, zobacz Dodawanie, pobieranie i usuwanie niestandardowych danych użytkownika do programu Identity.
- Zapisane tokeny dla użytkownika przechowywanego w Identity tabeli
AspNetUserTokens
bazy danych są usuwane po usunięciu użytkownika za pośrednictwem kaskadowego zachowania usuwania z powodu klucza obcego. - Uwierzytelnianie dostawcy zewnętrznego, takie jak Facebook i Google, nie jest dostępne przed zaakceptowaniem cookie zasad.
Szyfrowanie w spoczynku
Niektóre bazy danych i mechanizmy magazynowania umożliwiają szyfrowanie magazynowane. Szyfrowanie magazynowane:
- Szyfruje przechowywane dane automatycznie.
- Szyfruje bez konfiguracji, programowania lub innego oprogramowania, które uzyskuje dostęp do danych.
- Jest najprostszą i najbezpieczniejszą opcją.
- Umożliwia bazie danych zarządzanie kluczami i szyfrowaniem.
Przykład:
- Usługi Microsoft SQL i Azure SQL zapewniają funkcję Transparent Data Encryption (TDE).
- Usługi SQL Azure domyślnie szyfruje bazę danych
- Usługi Azure Blob, Files, Table i Queue Storage są domyślnie szyfrowane.
W przypadku baz danych, które nie zapewniają wbudowanego szyfrowania magazynowanych, może być możliwe użycie szyfrowania dysków w celu zapewnienia tej samej ochrony. Przykład:
Dodatkowe zasoby
- Szablony projektów obejmują punkty rozszerzeń i stubbed markup, które można zastąpić zasadami ochrony prywatności i cookie używania.
- Strona
Pages/Privacy.cshtml
lubViews/Home/Privacy.cshtml
widok zawiera stronę zawierającą szczegółowe informacje na temat zasad zachowania poufności informacji w witrynie.
Aby włączyć domyślną cookie funkcję wyrażania zgody, na przykład w szablonach platformy ASP.NET Core 2.2 w bieżącej aplikacji wygenerowanej ASP.NET Core:
Dodaj
using Microsoft.AspNetCore.Http
do listy dyrektyw using.Dodaj CookiePolicyOptions do i UseCookiePolicy do
Startup.Configure
Startup.ConfigureServices
: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 Dodaj wyrażenie zgody częściowe
_Layout.cshtml
do pliku:@*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"> © 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>
Dodaj plik _CookieConsentPartial.cshtml do projektu:
@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> }
Wybierz wersję tego artykułu ASP.NET Core 2.2, aby przeczytać o funkcji wyrażania cookie zgody.
- Szablony projektów obejmują punkty rozszerzeń i stubbed markup, które można zastąpić zasadami ochrony prywatności i cookie używania.
- Strona
Pages/Privacy.cshtml
lubViews/Home/Privacy.cshtml
widok zawiera stronę zawierającą szczegółowe informacje na temat zasad zachowania poufności informacji w witrynie.
Aby włączyć domyślną cookie funkcję wyrażania zgody, na przykład znajdującą się w szablonach platformy ASP.NET Core 2.2 w bieżącym szablonie ASP.NET Core wygenerowanym przez aplikację, dodaj następujący wyróżniony kod do Program.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();
W poprzednim kodzie CookiePolicyOptions i UseCookiePolicy są używane.
cookie Dodaj wyrażenie zgody częściowe
_Layout.cshtml
do pliku:@*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"> © 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>
_CookieConsentPartial.cshtml
Dodaj plik do projektu:@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-bs-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> }
Wybierz wersję tego artykułu ASP.NET Core 2.2, aby przeczytać o funkcji wyrażania cookie zgody.
Szyfrowanie w spoczynku
Niektóre bazy danych i mechanizmy magazynowania umożliwiają szyfrowanie magazynowane. Szyfrowanie magazynowane:
- Szyfruje przechowywane dane automatycznie.
- Szyfruje bez konfiguracji, programowania lub innego oprogramowania, które uzyskuje dostęp do danych.
- Jest najprostszą i najbezpieczniejszą opcją.
- Umożliwia bazie danych zarządzanie kluczami i szyfrowaniem.
Przykład:
- Usługi Microsoft SQL i Azure SQL zapewniają funkcję Transparent Data Encryption (TDE).
- Usługi SQL Azure domyślnie szyfruje bazę danych
- Usługi Azure Blob, Files, Table i Queue Storage są domyślnie szyfrowane.
W przypadku baz danych, które nie zapewniają wbudowanego szyfrowania magazynowanych, może być możliwe użycie szyfrowania dysków w celu zapewnienia tej samej ochrony. Przykład:
Dodatkowe zasoby
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla