0
Kunden0
Websites0
Cookies0
ConsentsConsent Trend (30 Tage)
Consent-Raten
Letzte Aktivitäten
| Zeit | Benutzer | Aktion | Beschreibung |
|---|---|---|---|
| Laden... | |||
Admin Dashboard
Geben Sie Ihre E-Mail-Adresse ein. Sie erhalten einen Link zum Zurücksetzen.
| Zeit | Benutzer | Aktion | Beschreibung |
|---|---|---|---|
| Laden... | |||
| Name | Status | Websites | Consents | Erstellt | Aktionen | |
|---|---|---|---|---|---|---|
| Laden... | ||||||
| Benutzername | Kunde | Rolle | Status | Letzter Login | Aktionen | |
|---|---|---|---|---|---|---|
| Laden... | ||||||
| Domain | Kunde | Cookies | Unbekannt | Consents | Letzter Scan | Aktionen | |
|---|---|---|---|---|---|---|---|
| Laden... | |||||||
| Zeit | Visitor ID | Entscheidung | Analytics | Marketing | Gerät | Browser |
|---|---|---|---|---|---|---|
| Bitte Website wählen... | ||||||
| Zeit | Benutzer | Aktion | Typ | Beschreibung |
|---|---|---|---|---|
| Laden... | ||||
| Name | Pattern | Kategorie | Provider | Zweck | Typ | Aktionen |
|---|---|---|---|---|---|---|
| Laden... | ||||||
Cookie Consent Manager — Setup, Konfiguration & Projektdokumentation
v2.2 .NET 8 IIS 10+ Klaro.js QuestPDF HangfireDer Cookie Consent Manager ist ein Multi-Tenant SaaS-System zur DSGVO-konformen Verwaltung von Cookie-Einwilligungen. Entwickelt für medizinische Praxis-Websites, kann das System jedoch universell eingesetzt werden.
Aktueller Stand des Systems (Februar 2026):
| Komponente | Anzahl | Details |
|---|---|---|
| Services | 11 | Auth, Tenant, Website, CookieScanner, KlaroConfig, Dashboard, Audit, Email, CookieKnowledge, PdfReport, Avv |
| Background Jobs | 3 | ScanJobService (Auto-Scans), LibraryCheckJob (Montag 3:00), HangfireAuthFilter |
| Controller | 4 | Public, Auth, Admin, Customer |
| Entities | 9 | Tenant, User, Website, Cookie, ThirdPartyScript, ConsentLog, AuditLog, ScanHistory, CookieKnowledgeBase |
| DB Migrationen | 13 | EF Core, auto-apply beim Start |
| Tests | 87 | 72 Unit + 15 Integration, xUnit + FluentAssertions + Moq + EF Core InMemory |
| NuGet Pakete | 17 | EF Core, Playwright, BCrypt, JWT, Serilog, Hangfire, MailKit, QuestPDF, Swagger |
| Phase | Beschreibung | Status |
|---|---|---|
| Phase 1 | Kritische Fixes — MimeKit-Update, Rate Limiting, Password Reset, Library-Check Job, Doc-Page Fix | Fertig |
| Phase 2 | Datenbank — ScanHistory Entity, GtmContainerId Migration | Fertig |
| Phase 3 | Backend Services — Scan-Diff-Mails, Auto-Beschreibungen, PDF Reports, Scan-Verlauf, Consent-Filter, GTM | Fertig |
| Phase 4 | Frontend — Banner Live-Vorschau, Scan-Trend Charts, Consent-Filter UI, Password Reset, Snippet Copy | Fertig |
| Phase 5 | WCAG 2.1 AA — Skip-Link, ARIA Labels, Focus-Visible, Keyboard Navigation, Reduced Motion | Fertig |
| Phase 6 | Tests — 49 Unit Tests (Auth, Knowledge, Klaro, Website, Dashboard, Email, PDF) | Fertig |
| Phase 7 | Szenario-Tests — 12 Use-Case Tests (Tenant-Lifecycle, Consent-Logging, Multi-Tenant-Isolation, Auth-Workflow, Klaro-Config, CSV-Export, AVV-PDF u.a.) | Fertig |
| Phase 8 | DSGVO-Compliance — Cookie-Liste im Banner, Consent-Versionierung, Consent-Erneuerung, AVV PDF (Art. 28), Consent-Export (Art. 20) | Fertig |
| Klaro | Integration — Self-Hosting, Consent-Callback, Floating Icon, Custom CSS/Logo, Port-Handling | Fertig |
| Phase 9-11 | Wave 1-3 — Bulk Ops, Enhanced Stats, Dashboard Refresh, Localization DE/EN, Frontend Modularisierung, Integration Tests, GitHub CI | Fertig |
| Phase 12 | Production Deployment — IIS web.config (HTTPS Redirect, WebDAV Fix), Split CORS, HTTPS-URLs, AcceptedAll Fix, Swagger & Hangfire offen | Fertig |
| Tool | URL | Beschreibung |
|---|---|---|
| Swagger API | /swagger |
Interaktive REST API Dokumentation — alle Endpoints testen und erkunden |
| Hangfire Dashboard | /hangfire |
Background Jobs verwalten — Recurring Jobs, Scan-Queue, fehlgeschlagene Jobs, Library-Check |
| Health Check | /api/health |
System-Gesundheitsprüfung (kein Auth nötig) |
library-vulnerability-check Job (Montag 3:00 Uhr). Über Trigger now
können Sie die NuGet-Sicherheitsprüfung manuell starten.
NuGet-Pakete und deren Sicherheitsstatus. Der automatische Vulnerability-Check läuft jeden Montag um 3:00 Uhr.
Klicken Sie auf "Pakete laden & prüfen" um die aktuelle Paketliste mit Sicherheitsstatus anzuzeigen.
| Komponente | Anforderung |
|---|---|
| Betriebssystem | Windows Server 2016+ / Windows 10+ |
| Webserver | IIS 10+ mit ASP.NET Core Modul |
| Runtime | .NET 8 Runtime + Hosting Bundle |
| Datenbank | SQL Server 2019+ oder SQL Server Express |
| RAM | Min. 2 GB (4 GB empfohlen, Playwright benötigt Speicher) |
| Speicherplatz | 500 MB App + 200 MB Chromium (wird automatisch heruntergeladen) |
| Browser (Scan) | Chromium (automatischer Download beim ersten Scan) |
Das ASP.NET Core Hosting Bundle enthält die .NET Runtime und das IIS ASP.NET Core Modul. Es ist zwingend erforderlich, damit IIS .NET-Anwendungen hosten kann.
https://dotnet.microsoft.com/download/dotnet/8.0 herunternet stop was /y
net start w3svc
dotnet --list-runtimes in der Kommandozeile.
Erstellen Sie einen Release-Build der Anwendung:
dotnet publish -c Release -o C:\publish\CookieConsentManager
Der Ordner C:\publish\CookieConsentManager enthält danach alle benötigten Dateien:
CookieConsentManager.dll — Hauptanwendungwwwroot/ — Statische Dateien (Frontend, CSS, JS)appsettings.json — Konfiguration (muss angepasst werden)web.config — IIS-Konfiguration (wird automatisch generiert)inetmgr)CookieConsentManagerNo Managed CodeIntegratedNo Managed Code stehen!
ASP.NET Core läuft als eigenständiger Prozess, nicht innerhalb der CLR von IIS.
CookieConsentManagerCookieConsentManager (oben erstellt)C:\publish\CookieConsentManager80 (oder 443 mit SSL-Zertifikat)consent.example.com)Die web.config wird beim Publish automatisch generiert. Sie konfiguriert das ASP.NET Core Modul in IIS:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<location path="." inheritInChildApplications="false">
<system.webServer>
<handlers>
<add name="aspNetCore" path="*" verb="*"
modules="AspNetCoreModuleV2"
resourceType="Unspecified" />
</handlers>
<aspNetCore processPath="dotnet"
arguments=".\CookieConsentManager.dll"
stdoutLogEnabled="false"
stdoutLogFile=".\logs\stdout"
hostingModel="InProcess">
<environmentVariables>
<environmentVariable name="ASPNETCORE_ENVIRONMENT"
value="Production" />
</environmentVariables>
</aspNetCore>
</system.webServer>
</location>
</configuration>
| Einstellung | Beschreibung |
|---|---|
hostingModel="InProcess" | App läuft im IIS-Arbeitsprozess (w3wp.exe) — beste Performance |
stdoutLogEnabled | Auf true setzen zum Debuggen von Startfehlern |
stdoutLogFile | Pfad für Stdout-Logs (Ordner muss existieren!) |
stdoutLogEnabled="true" und prüfen
Sie die Datei unter .\logs\stdout_*.log.
Bearbeiten Sie die appsettings.json im Publish-Ordner:
{
"ConnectionStrings": {
"DefaultConnection": "Server=SERVERNAME\\SQLEXPRESS;Database=CookieConsent;Integrated Security=True;TrustServerCertificate=True;"
}
}
Ersetzen Sie SERVERNAME durch den Namen Ihres SQL Servers. Bei Verwendung von SQL-Authentifizierung:
"DefaultConnection": "Server=SERVERNAME;Database=CookieConsent;User Id=sa;Password=IhrPasswort;TrustServerCertificate=True;"
Integrated Security=True muss der App-Pool-Benutzer
(Standard: IIS AppPool\CookieConsentManager) Zugriff auf die Datenbank haben.
SQL Server Berechtigungen für den App Pool setzen:
-- In SQL Server Management Studio ausführen:
CREATE LOGIN [IIS AppPool\CookieConsentManager] FROM WINDOWS;
USE CookieConsent;
CREATE USER [IIS AppPool\CookieConsentManager] FOR LOGIN [IIS AppPool\CookieConsentManager];
ALTER ROLE db_owner ADD MEMBER [IIS AppPool\CookieConsentManager];
HTTPS ist für den produktiven Betrieb zwingend erforderlich, insbesondere für:
Secure, SameSite)https://www.win-acme.com/)wacs.exe aus und folgen Sie dem Assistentenhttps443, SSL-Zertifikat auswählenDer App-Pool-Benutzer benötigt Schreibzugriff auf folgende Ordner:
| Ordner | Berechtigung | Zweck |
|---|---|---|
logs\ | Schreiben | Serilog Rolling File Logs |
wwwroot\ | Lesen | Statische Dateien |
Berechtigungen setzen (PowerShell als Administrator):
$publishPath = "C:\publish\CookieConsentManager"
$appPoolUser = "IIS AppPool\CookieConsentManager"
# Logs-Ordner erstellen und Berechtigung setzen
New-Item -Path "$publishPath\logs" -ItemType Directory -Force
icacls "$publishPath\logs" /grant "${appPoolUser}:(OI)(CI)M" /T
Der Cookie Scanner verwendet Playwright mit Chromium. Beim ersten Scan wird Chromium automatisch heruntergeladen (~200 MB).
Falls der Server keinen Internetzugang hat, können Sie Chromium vorab herunterladen:
# Im Publish-Ordner ausführen:
$env:PLAYWRIGHT_BROWSERS_PATH = "C:\publish\CookieConsentManager\.playwright"
npx playwright install chromium
Setzen Sie dann die Umgebungsvariable in der web.config:
<environmentVariables>
<environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Production" />
<environmentVariable name="PLAYWRIGHT_BROWSERS_PATH"
value="C:\publish\CookieConsentManager\.playwright" />
</environmentVariables>
Alle Einstellungen befinden sich in appsettings.json:
"Jwt": {
"Key": "MindestensZeichenLangerGeheimer!!SchluesselHier123",
"Issuer": "CookieConsentManager",
"Audience": "CookieConsentManager"
}
"AdminCredentials": {
"Username": "admin",
"Password": "Admin123!",
"Email": "admin@example.com"
}
Diese Zugangsdaten werden beim Start geprüft. Der Admin-Benutzer kann auch in der Datenbank erstellt werden.
"Cors": {
"AllowedOrigins": [
"https://ihre-domain.at",
"https://www.ihre-domain.at",
"https://praxis-website.at"
]
}
Tragen Sie hier alle Domains ein, die den Cookie-Banner einbinden. Die Klaro.js-Konfiguration und die Consent-API werden von diesen Domains aufgerufen.
"Email": {
"SmtpHost": "smtp-relay.brevo.com",
"SmtpPort": 587,
"UseSsl": true,
"Username": "ihre-email@example.com",
"Password": "smtp-api-key",
"FromEmail": "noreply@example.com",
"FromName": "Cookie Consent Manager"
}
Wird für Passwort-Zurücksetzen-E-Mails verwendet. Unterstützt jeden SMTP-kompatiblen Dienst (Brevo, SendGrid, etc.).
"Kestrel": {
"Endpoints": {
"Http": {
"Url": "http://0.0.0.0:5000"
}
}
}
Bei IIS-Hosting (InProcess) wird diese Einstellung ignoriert, da IIS den Port verwaltet.
Vollständige interaktive API-Dokumentation unter /swagger.
Alle authentifizierten Endpoints erfordern einen JWT Bearer Token im Authorization Header.
| Methode | Endpoint | Beschreibung |
|---|---|---|
| POST | /api/auth/login | Login, gibt JWT Token zurück |
| PUT | /api/auth/change-password | Passwort ändern |
| GET | /api/auth/me | Aktuellen Benutzer abrufen |
| Methode | Endpoint | Beschreibung |
|---|---|---|
| GET | /api/config/{domain} | Klaro.js Konfiguration für eine Domain (inkl. Cookie-Liste) |
| POST | /api/consent | Consent-Einwilligung protokollieren |
| GET | /api/consent/export | Consent-Export für Besucher (Art. 20 DSGVO) |
| GET | /api/health | Health Check |
| Methode | Endpoint | Beschreibung |
|---|---|---|
| GET | /api/admin/tenants | Alle Mandanten auflisten |
| POST | /api/admin/tenants | Neuen Mandanten anlegen |
| GET | /api/admin/websites | Alle Websites auflisten |
| POST | /api/admin/websites/{id}/scan | Website-Scan starten |
| GET | /api/admin/dashboard | Admin-Dashboard-Daten |
| GET | /api/admin/tenants/{id}/avv | AVV PDF herunterladen (Art. 28 DSGVO) |
| Methode | Endpoint | Beschreibung |
|---|---|---|
| GET | /api/customer/websites | Eigene Websites auflisten |
| GET | /api/customer/cookies | Cookies der eigenen Websites |
| GET | /api/customer/dashboard | Kunden-Dashboard-Daten |
| POST | /api/customer/websites/{id}/scan | Eigene Website scannen |
| GET | /api/customer/avv | AVV PDF herunterladen (Art. 28 DSGVO) |
curl -X POST https://consent.example.com/api/auth/login \
-H "Content-Type: application/json" \
-d '{"username": "admin", "password": "Admin123!"}'
# Antwort:
# { "token": "eyJhbGciOiJIUzI1NiIs..." }
# Token verwenden:
curl https://consent.example.com/api/admin/tenants \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
Das System implementiert folgende österreichische/europäische DSGVO-Anforderungen:
Der Klaro-Banner zeigt pro Service/Provider eine HTML-Tabelle mit allen zugehörigen Cookies. Jede Zeile enthält den Cookie-Namen, seinen Zweck und die Laufzeit (z.B. „Session“, „1 Tag“, „2 Jahre“). Die Tabelle wird automatisch aus den Scan-Ergebnissen generiert.
Jede Änderung an der Banner-Konfiguration (Farben, Texte, Sprachen, Logo) erhöht automatisch die BannerVersion.
Das Integrations-Snippet prüft beim Laden, ob die gespeicherte Version mit der aktuellen übereinstimmt.
Bei Abweichung wird das Klaro-Cookie gelöscht und der Banner erneut angezeigt.
Pro Website kann eine Gültigkeitsdauer für Einwilligungen festgelegt werden (1–730 Tage, Standard: 365). Nach Ablauf wird der Cookie-Banner automatisch erneut angezeigt. Einstellbar unter Websites → Snippet → Anpassen → Consent-Gültigkeit.
Automatisch generierter Auftragsverarbeiter-Vertrag (AVV) als PDF gemäß Art. 28 DSGVO. Der Vertrag wird mit den Daten des jeweiligen Mandanten (Name, Adresse, Websites) vorbefüllt und enthält:
Download: Kunden → -Button oder GET /api/admin/tenants/{id}/avv
Besucher können ihre Consent-Daten über den öffentlichen Endpoint exportieren:
GET /api/consent/export?visitorId={id}&domain={domain}
Gibt bis zu 100 Consent-Einträge als JSON zurück (Consent-Typ, Kategorien, Gerät, Browser, Zeitstempel). Ermöglicht die Erfüllung des Rechts auf Datenübertragbarkeit gemäß Art. 20 DSGVO.
Die Cookies-Tabelle zeigt für jeden Cookie die Laufzeit an (Session, 1 Tag, 30 Tage, 1 Jahr, 2 Jahre etc.). Diese Information wird auch im Klaro-Banner pro Service angezeigt.
Der einfachste Weg: Kopieren Sie das fertige Snippet aus der Admin-Oberfläche (Websites → Website auswählen → Snippet-Button). Das Snippet wird automatisch generiert und enthält alle Einstellungen.
Das generierte Snippet fügt folgende Komponenten in den <head>-Bereich ein:
<!-- Cookie Consent Manager - Klaro.js (self-hosted) -->
<link rel="stylesheet" href="https://consent.example.com/lib/klaro/klaro.min.css" />
<script>
// 1. Konfiguration vom CCM-Server laden
// 2. Custom CSS (Farben, Logo) injizieren
// 3. Klaro.js dynamisch laden
// 4. Consent-Callback registriert (POST an /api/consent)
// 5. Floating Cookie-Icon anzeigen
</script>
fetch() von /api/config/{domain}<style> injiziert/api/consent gesendetKlaro.js wird self-hosted ausgeliefert (kein CDN-Abhängigkeit):
| Datei | Pfad | Beschreibung |
|---|---|---|
| CSS | /lib/klaro/klaro.min.css | Klaro Stylesheet (~19 KB) |
| JS | /lib/klaro/klaro-no-css.js | Klaro Runtime ohne CSS (~212 KB) |
Für Domains mit Port (z.B. localhost:8080) wird automatisch der Query-Parameter-Modus verwendet:
/api/config?d=localhost:8080 statt /api/config/localhost:8080.
consent.example.com durch die Domain Ihres
Cookie Consent Managers. Das Snippet im Admin-Panel ist bereits korrekt vorkonfiguriert.
Übersicht der wichtigsten Geschäftsprozesse im System.
sequenceDiagram
actor Admin
participant Server
participant DB
Admin->>Server: POST /api/admin/tenants
Server->>DB: Tenant + User anlegen
Server-->>Admin: Tenant erstellt
actor Kunde
Kunde->>Server: POST /api/auth/login
Server->>DB: Passwort prüfen (BCrypt)
Server-->>Kunde: JWT Token
sequenceDiagram
actor User
participant Server
participant Scanner as Playwright
participant DB
User->>Server: Website anlegen
Server->>DB: Website speichern
User->>Server: Scan starten
Server->>Scanner: Seiten crawlen
loop Pro Seite (~9s)
Scanner->>Scanner: Laden, Scrollen, Banner akzeptieren
Scanner->>Scanner: Cookies + Scripts extrahieren
end
Scanner-->>Server: Ergebnis
Server->>DB: Cookies + Scripts speichern
Server->>DB: Auto-Kategorisierung (KB)
Server-->>User: Scan fertig
Note over User,Server: Live-Fortschritt via Polling (2s)
sequenceDiagram
actor Besucher
participant Website
participant Server
participant DB
Besucher->>Website: Seite aufrufen
Website->>Server: Klaro-Config laden
Server-->>Website: Config + Banner-Design
Website-->>Besucher: Cookie-Banner anzeigen
Besucher->>Website: Entscheidung treffen
Website->>Server: POST /api/consent
Server->>DB: ConsentLog speichern (IP gehasht)
Website-->>Besucher: Cookie-Icon (Einstellungen ändern)
flowchart LR
A[Neuer Cookie] --> B{In Knowledge Base?}
B -->|Ja| C[Auto-Kategorie]
B -->|Nein| D[Unknown]
D --> E[Admin prüft]
E --> F[Kategorie setzen]
F --> G{In KB speichern?}
G -->|Ja| H[KB-Eintrag]
H --> I[Zukünftig automatisch]
G -->|Nein| J[Fertig]
style A fill:#4f46e5,color:#fff
style C fill:#10b981,color:#fff
style D fill:#f59e0b,color:#fff
style H fill:#6366f1,color:#fff
sequenceDiagram
actor Admin
participant Server
participant DB
Admin->>Server: Design anpassen (Farben, Logo, Text)
Server->>DB: Customization speichern
Server->>DB: BannerVersion hochzählen
Note over DB: Version 3 → 4
actor Besucher
Besucher->>Server: Config laden
Server-->>Besucher: Neue Version erkannt
Note over Besucher: Altes Cookie gelöscht
Besucher-->>Besucher: Banner erneut anzeigen
sequenceDiagram
participant Hangfire
participant Server
participant DB
participant E-Mail
Note over Hangfire: 2:00-4:00 Uhr (Wien)
Hangfire->>Server: Scan-Job starten
Server->>Server: Website scannen
Server->>DB: Ergebnis speichern + Diff
alt Änderungen gefunden
Server->>E-Mail: Diff-Bericht senden
end
Server->>Hangfire: Nächsten Scan planen (+7 Tage)
sequenceDiagram
actor User
participant Server
participant E-Mail
participant DB
User->>Server: E-Mail eingeben
Server->>DB: Reset-Token generieren
Server->>E-Mail: Link senden
E-Mail-->>User: Reset-Link
User->>Server: Neues Passwort setzen
Server->>DB: Passwort ändern (BCrypt)
Server-->>User: Erfolg → Login
flowchart LR
A[PDF Report] --> B[QuestPDF]
B --> C[Cookie-Inventar + Consent-Stats + Scan-Verlauf]
C --> D[PDF Download]
E[AVV Art.28] --> F[QuestPDF]
F --> G[Vertragsparteien + TOMs + Rechte]
G --> H[PDF Download]
I[CSV Export] --> J[Cookies oder Consent-Logs]
J --> K[CSV Download]
style A fill:#4f46e5,color:#fff
style E fill:#7c3aed,color:#fff
style I fill:#0891b2,color:#fff
style D fill:#f59e0b,color:#fff
style H fill:#f59e0b,color:#fff
style K fill:#f59e0b,color:#fff
web.config: stdoutLogEnabled="true"logs-Ordner existiertlogs\stdout_*.logiisresetMigrateAsync())CREATE DATABASE-Rechte haben (beim ersten Start)appsettings.jsonappsettings.json → Cors.AllowedOrigins einhttps://www.example.comDie Anwendung schreibt strukturierte Logs mit Serilog:
| Log-Quelle | Pfad |
|---|---|
| Anwendungslogs | logs\cookie-manager-YYYYMMDD.log |
| IIS Stdout-Logs | logs\stdout_*.log |
| Windows Event Log | Ereignisanzeige → Anwendung |
Das Hangfire Dashboard zur Verwaltung von Background Jobs ist unter /hangfire erreichbar.
Es erfordert Admin-Authentifizierung (Basic Auth mit den Admin-Zugangsdaten aus appsettings.json).
Verfügbare Jobs:
| Job | Zeitplan | Beschreibung |
|---|---|---|
library-vulnerability-check | Montag 3:00 Uhr | NuGet-Pakete auf bekannte Schwachstellen prüfen, E-Mail bei Fund |
| Website Auto-Scans | Pro Website (Standard: 7 Tage) | Automatische Nacht-Scans (2:00–4:00 Uhr), dynamisch geplant |