Dashboard

0

Kunden

0

Websites

0

Cookies

0

Consents
Consent Trend (30 Tage)
Consent-Raten
Letzte Aktivitäten
Letzte Aktivitäten
Zeit Benutzer Aktion Beschreibung
Laden...
Kunden verwalten
Kundenliste
Name E-Mail Status Websites Consents Erstellt Aktionen
Laden...
Benutzer verwalten
Benutzerliste
Benutzername E-Mail Kunde Rolle Status Letzter Login Aktionen
Laden...
Websites verwalten
Website-Liste
Domain Kunde Cookies Unbekannt Consents Letzter Scan Aktionen
Laden...
Cookies verwalten
Gesamt

0

Zu prüfen

0

Genehmigt

0

First-Party

0

Name Domain Kategorie Provider Zweck Laufzeit Status Aktionen
Laden...
Consent-Protokoll

0

Gesamt

0

Heute

0%

Accept Rate

0%

Reject Rate
Consent-Protokoll
Zeit Visitor ID Entscheidung Analytics Marketing Gerät Browser
Bitte Website wählen...
Erweiterte Statistiken
Zeitvergleich
Geografische Verteilung
Consent-Verlauf
Audit Log
Audit-Log
Zeit Benutzer Aktion Typ Beschreibung
Laden...
Cookie-Wissensdatenbank
Gesamt

0

System

0

Custom

0

Kategorien

-

Name Pattern Kategorie Provider Zweck Typ Aktionen
Laden...

Dokumentation

Cookie Consent Manager — Setup, Konfiguration & Projektdokumentation

v2.2 .NET 8 IIS 10+ Klaro.js QuestPDF Hangfire

Übersicht

Der 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.

Features

  • Automatischer Cookie-Scan — Playwright-basiertes Scannen von Websites mit Erkennung von Cookies und Drittanbieter-Skripten
  • Klaro.js Integration — Self-hosted Cookie-Banner mit Live-Vorschau, Design-Anpassung und Floating-Icon
  • DSGVO-Audit-Trail — Lückenlose Protokollierung aller Einwilligungen mit gehashten IP-Adressen
  • Multi-Tenant — Strikte Datentrennung zwischen Kunden (Mandanten)
  • Admin & Kunden-Dashboard — Rollenbasierte Verwaltungsoberfläche mit Charts und Statistiken
  • Automatische Scans — Wiederkehrende Nacht-Scans (2:00–4:00 Uhr) via Hangfire
  • PDF Compliance-Reports — QuestPDF-basierte Reports mit Cookie-Inventar und Consent-Statistiken
  • Scan-Verlauf & Trends — Chart.js Visualisierung der Cookie-/Script-Entwicklung
  • Cookie Knowledge Base — Auto-Kategorisierung mit Pattern-Matching und Seed-Daten
  • E-Mail-Benachrichtigungen — Scan-Diff-Mails, unbekannte Cookies, Passwort-Reset via SMTP
  • Google Integration — Consent Mode v2 und Google Tag Manager (GTM) Unterstützung
  • Library-Vulnerability-Check — Wöchentliche automatische NuGet-Sicherheitsprüfung
  • Cookie-Liste im Banner — Klaro zeigt pro Service eine Tabelle mit Cookie-Name, Zweck und Laufzeit
  • Consent-Versionierung — Banner wird bei Konfigurationsänderungen automatisch erneut angezeigt
  • Consent-Erneuerung — Konfigurierbare Gültigkeitsdauer der Einwilligung (1–730 Tage)
  • AVV-Vorlage (Art. 28 DSGVO) — Automatisch generierter Auftragsverarbeiter-Vertrag als PDF
  • Consent-Export (Art. 20 DSGVO) — Öffentlicher API-Endpoint für Datenübertragbarkeit
  • WCAG 2.1 AA — Barrierefreiheit mit ARIA, Keyboard-Navigation und Skip-Links
  • REST API — Vollständige API mit Swagger-Dokumentation
  • Rate Limiting — Schutz der Public-Endpoints (100 Req/Min), authentifiziert (200/Min), Scan-Concurrency (3)

Projekt-Status

Aktueller Stand des Systems (Februar 2026):

KomponenteAnzahlDetails
Services11Auth, Tenant, Website, CookieScanner, KlaroConfig, Dashboard, Audit, Email, CookieKnowledge, PdfReport, Avv
Background Jobs3ScanJobService (Auto-Scans), LibraryCheckJob (Montag 3:00), HangfireAuthFilter
Controller4Public, Auth, Admin, Customer
Entities9Tenant, User, Website, Cookie, ThirdPartyScript, ConsentLog, AuditLog, ScanHistory, CookieKnowledgeBase
DB Migrationen13EF Core, auto-apply beim Start
Tests8772 Unit + 15 Integration, xUnit + FluentAssertions + Moq + EF Core InMemory
NuGet Pakete17EF Core, Playwright, BCrypt, JWT, Serilog, Hangfire, MailKit, QuestPDF, Swagger

Umgesetzte Feature-Phasen

PhaseBeschreibungStatus
Phase 1Kritische Fixes — MimeKit-Update, Rate Limiting, Password Reset, Library-Check Job, Doc-Page FixFertig
Phase 2Datenbank — ScanHistory Entity, GtmContainerId MigrationFertig
Phase 3Backend Services — Scan-Diff-Mails, Auto-Beschreibungen, PDF Reports, Scan-Verlauf, Consent-Filter, GTMFertig
Phase 4Frontend — Banner Live-Vorschau, Scan-Trend Charts, Consent-Filter UI, Password Reset, Snippet CopyFertig
Phase 5WCAG 2.1 AA — Skip-Link, ARIA Labels, Focus-Visible, Keyboard Navigation, Reduced MotionFertig
Phase 6Tests — 49 Unit Tests (Auth, Knowledge, Klaro, Website, Dashboard, Email, PDF)Fertig
Phase 7Szenario-Tests — 12 Use-Case Tests (Tenant-Lifecycle, Consent-Logging, Multi-Tenant-Isolation, Auth-Workflow, Klaro-Config, CSV-Export, AVV-PDF u.a.)Fertig
Phase 8DSGVO-Compliance — Cookie-Liste im Banner, Consent-Versionierung, Consent-Erneuerung, AVV PDF (Art. 28), Consent-Export (Art. 20)Fertig
KlaroIntegration — Self-Hosting, Consent-Callback, Floating Icon, Custom CSS/Logo, Port-HandlingFertig
Phase 9-11Wave 1-3 — Bulk Ops, Enhanced Stats, Dashboard Refresh, Localization DE/EN, Frontend Modularisierung, Integration Tests, GitHub CIFertig
Phase 12Production Deployment — IIS web.config (HTTPS Redirect, WebDAV Fix), Split CORS, HTTPS-URLs, AcceptedAll Fix, Swagger & Hangfire offenFertig

Developer Tools

ToolURLBeschreibung
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)
Tipp: Im Hangfire Dashboard unter Recurring Jobs finden Sie den library-vulnerability-check Job (Montag 3:00 Uhr). Über Trigger now können Sie die NuGet-Sicherheitsprüfung manuell starten.

Verwendete Bibliotheken

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.

Systemanforderungen

KomponenteAnforderung
BetriebssystemWindows Server 2016+ / Windows 10+
WebserverIIS 10+ mit ASP.NET Core Modul
Runtime.NET 8 Runtime + Hosting Bundle
DatenbankSQL Server 2019+ oder SQL Server Express
RAMMin. 2 GB (4 GB empfohlen, Playwright benötigt Speicher)
Speicherplatz500 MB App + 200 MB Chromium (wird automatisch heruntergeladen)
Browser (Scan)Chromium (automatischer Download beim ersten Scan)

IIS Installation Schritt-für-Schritt

1. .NET 8 Hosting Bundle installieren

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.

  1. Laden Sie das .NET 8 Hosting Bundle von https://dotnet.microsoft.com/download/dotnet/8.0 herunter
  2. Führen Sie den Installer als Administrator aus
  3. Starten Sie IIS neu:
    net stop was /y
    net start w3svc
Tipp: Überprüfen Sie die Installation mit dotnet --list-runtimes in der Kommandozeile.

2. Anwendung veröffentlichen (Publish)

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 — Hauptanwendung
  • wwwroot/ — Statische Dateien (Frontend, CSS, JS)
  • appsettings.json — Konfiguration (muss angepasst werden)
  • web.config — IIS-Konfiguration (wird automatisch generiert)

3. IIS Website & App Pool anlegen

App Pool erstellen

  1. Öffnen Sie den IIS Manager (inetmgr)
  2. Rechtsklick auf Application Pools → Add Application Pool
  3. Name: CookieConsentManager
  4. .NET CLR Version: No Managed Code
  5. Pipeline Mode: Integrated
Wichtig: Der App Pool muss auf No Managed Code stehen! ASP.NET Core läuft als eigenständiger Prozess, nicht innerhalb der CLR von IIS.

Website erstellen

  1. Rechtsklick auf Sites → Add Website
  2. Site name: CookieConsentManager
  3. Application Pool: CookieConsentManager (oben erstellt)
  4. Physical path: C:\publish\CookieConsentManager
  5. Binding: Port 80 (oder 443 mit SSL-Zertifikat)
  6. Host name: Ihre Domain (z.B. consent.example.com)

4. web.config Erklärung

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>
EinstellungBeschreibung
hostingModel="InProcess"App läuft im IIS-Arbeitsprozess (w3wp.exe) — beste Performance
stdoutLogEnabledAuf true setzen zum Debuggen von Startfehlern
stdoutLogFilePfad für Stdout-Logs (Ordner muss existieren!)
Tipp: Bei Startproblemen setzen Sie stdoutLogEnabled="true" und prüfen Sie die Datei unter .\logs\stdout_*.log.

5. Connection String anpassen

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;"
Hinweis: Bei 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];

6. HTTPS/SSL einrichten

HTTPS ist für den produktiven Betrieb zwingend erforderlich, insbesondere für:

  • Sichere JWT-Token-Übertragung
  • Cookie-Attribute (Secure, SameSite)
  • DSGVO-Konformität

Option A: Let's Encrypt (empfohlen)

  1. Installieren Sie win-acme (https://www.win-acme.com/)
  2. Führen Sie wacs.exe aus und folgen Sie dem Assistenten
  3. Wählen Sie die IIS-Website und die Domain aus
  4. Das Zertifikat wird automatisch verlängert

Option B: Eigenes Zertifikat

  1. Importieren Sie das Zertifikat in den Windows-Zertifikatspeicher
  2. Im IIS Manager: Site → Bindings → Add → https
  3. Port: 443, SSL-Zertifikat auswählen
  4. Optional: HTTP → HTTPS Redirect über URL Rewrite einrichten

7. Dateiberechtigungen

Der App-Pool-Benutzer benötigt Schreibzugriff auf folgende Ordner:

OrdnerBerechtigungZweck
logs\SchreibenSerilog Rolling File Logs
wwwroot\LesenStatische 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

8. Playwright/Chromium Setup

Der Cookie Scanner verwendet Playwright mit Chromium. Beim ersten Scan wird Chromium automatisch heruntergeladen (~200 MB).

Voraussetzungen auf dem Server

  • Internetzugang beim ersten Scan (für Chromium-Download)
  • Ausreichend Speicherplatz (~200 MB für Chromium)
  • Der App-Pool-Benutzer muss Schreibzugriff auf das Chromium-Cache-Verzeichnis haben

Manueller Chromium-Download (optional)

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>
Sicherheitshinweis: Playwright startet einen Headless-Browser. Stellen Sie sicher, dass Ihre Firewall ausgehende HTTP/HTTPS-Verbindungen vom Server erlaubt (für Website-Scans).

Konfiguration

Alle Einstellungen befinden sich in appsettings.json:

JWT-Authentifizierung

"Jwt": {
  "Key": "MindestensZeichenLangerGeheimer!!SchluesselHier123",
  "Issuer": "CookieConsentManager",
  "Audience": "CookieConsentManager"
}
Wichtig: Ändern Sie den JWT Key unbedingt in der Produktion! Er muss mindestens 32 Zeichen lang sein.

Admin-Zugangsdaten

"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.

Ändern Sie das Standard-Passwort sofort nach der ersten Anmeldung!

CORS (Cross-Origin Resource Sharing)

"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.

E-Mail (SMTP)

"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 (Port-Konfiguration)

"Kestrel": {
  "Endpoints": {
    "Http": {
      "Url": "http://0.0.0.0:5000"
    }
  }
}

Bei IIS-Hosting (InProcess) wird diese Einstellung ignoriert, da IIS den Port verwaltet.

API-Übersicht

Vollständige interaktive API-Dokumentation unter /swagger. Alle authentifizierten Endpoints erfordern einen JWT Bearer Token im Authorization Header.

Authentifizierung

MethodeEndpointBeschreibung
POST/api/auth/loginLogin, gibt JWT Token zurück
PUT/api/auth/change-passwordPasswort ändern
GET/api/auth/meAktuellen Benutzer abrufen

Öffentliche Endpoints (kein Token nötig)

MethodeEndpointBeschreibung
GET/api/config/{domain}Klaro.js Konfiguration für eine Domain (inkl. Cookie-Liste)
POST/api/consentConsent-Einwilligung protokollieren
GET/api/consent/exportConsent-Export für Besucher (Art. 20 DSGVO)
GET/api/healthHealth Check

Admin Endpoints

MethodeEndpointBeschreibung
GET/api/admin/tenantsAlle Mandanten auflisten
POST/api/admin/tenantsNeuen Mandanten anlegen
GET/api/admin/websitesAlle Websites auflisten
POST/api/admin/websites/{id}/scanWebsite-Scan starten
GET/api/admin/dashboardAdmin-Dashboard-Daten
GET/api/admin/tenants/{id}/avvAVV PDF herunterladen (Art. 28 DSGVO)

Kunden Endpoints

MethodeEndpointBeschreibung
GET/api/customer/websitesEigene Websites auflisten
GET/api/customer/cookiesCookies der eigenen Websites
GET/api/customer/dashboardKunden-Dashboard-Daten
POST/api/customer/websites/{id}/scanEigene Website scannen
GET/api/customer/avvAVV PDF herunterladen (Art. 28 DSGVO)

Token abrufen (Beispiel)

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..."

DSGVO-Compliance Features

Das System implementiert folgende österreichische/europäische DSGVO-Anforderungen:

Cookie-Liste im Consent-Banner

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.

Consent-Versionierung

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.

Automatische Consent-Erneuerung

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.

AVV-Vorlage (Art. 28 DSGVO)

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:

  • § 1 Vertragsparteien
  • § 2 Gegenstand und Dauer der Verarbeitung
  • § 3 Art der personenbezogenen Daten
  • § 4 Kategorien betroffener Personen
  • § 5 Technische und organisatorische Maßnahmen (TOMs)
  • § 6 Unterauftragnehmer
  • § 7 Rechte der betroffenen Personen
  • § 8 Löschung nach Vertragsende
  • § 9 Kontroll- und Prüfrechte

Download: Kunden → -Button oder GET /api/admin/tenants/{id}/avv

Consent-Export (Art. 20 DSGVO)

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.

Cookie-Lebensdauer

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.

Website-Integration

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>

So funktioniert es

  1. Konfig-Abruf: Das Snippet lädt die Klaro-Konfiguration per fetch() von /api/config/{domain}
  2. Design-Anpassung: Custom CSS (Farben, Logo) wird aus der Konfiguration extrahiert und als <style> injiziert
  3. Klaro.js laden: Klaro wird erst nach dem Config-Fetch dynamisch geladen (vermeidet Race Conditions)
  4. Banner anzeigen: Cookie-Banner erscheint automatisch beim ersten Besuch
  5. Consent speichern: Bei Zustimmung/Ablehnung wird ein Consent-Log an /api/consent gesendet
  6. Cookie-Icon: Nach getroffener Entscheidung erscheint links unten ein Cookie-Symbol zum Überarbeiten der Einstellungen

Klaro.js Dateien

Klaro.js wird self-hosted ausgeliefert (kein CDN-Abhängigkeit):

DateiPfadBeschreibung
CSS/lib/klaro/klaro.min.cssKlaro Stylesheet (~19 KB)
JS/lib/klaro/klaro-no-css.jsKlaro Runtime ohne CSS (~212 KB)

Domains mit Port

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.

Tipp: Ersetzen Sie consent.example.com durch die Domain Ihres Cookie Consent Managers. Das Snippet im Admin-Panel ist bereits korrekt vorkonfiguriert.

Event Modeling

Übersicht der wichtigsten Geschäftsprozesse im System.

1. Tenant Onboarding

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
                            

2. Website-Registrierung & Scan

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
                            

5. Banner-Anpassung

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
                            

6. Automatischer Nacht-Scan

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)
                            

7. Passwort-Reset

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
                            

8. Reports & Export

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
                            

Troubleshooting

HTTP 500.30 — App startet nicht

  1. Aktivieren Sie Stdout-Logging in web.config: stdoutLogEnabled="true"
  2. Stellen Sie sicher, dass der logs-Ordner existiert
  3. Prüfen Sie die Stdout-Log-Datei unter logs\stdout_*.log
  4. Häufigste Ursache: Connection String falsch oder SQL Server nicht erreichbar

HTTP 502.5 — Process Failure

  • Prüfen Sie, ob das .NET 8 Hosting Bundle installiert ist
  • Starten Sie IIS neu: iisreset
  • Prüfen Sie die Windows Event Logs (Anwendung)

Datenbankfehler beim Start

  • Die Datenbank wird automatisch erstellt (MigrateAsync())
  • Der Benutzer muss CREATE DATABASE-Rechte haben (beim ersten Start)
  • Prüfen Sie den Connection String in appsettings.json
  • Testen Sie die Verbindung mit SQL Server Management Studio

Cookie Scanner funktioniert nicht

  • Chromium nicht gefunden: Beim ersten Scan wird Chromium heruntergeladen. Stellen Sie sicher, dass der Server Internetzugang hat.
  • Timeout: Langsame Websites können den Scan-Timeout überschreiten. Prüfen Sie die Netzwerkverbindung des Servers.
  • Berechtigungsfehler: Der App-Pool-Benutzer muss Schreibzugriff auf das Chromium-Verzeichnis haben.
  • Firewall: Ausgehende HTTP/HTTPS-Verbindungen müssen erlaubt sein.

CORS-Fehler im Browser

  • Tragen Sie die Domain der Website in appsettings.json → Cors.AllowedOrigins ein
  • Verwenden Sie die exakte Domain inkl. Protokoll: https://www.example.com
  • Starten Sie die Anwendung nach Änderungen an der Konfiguration neu

Logs einsehen

Die Anwendung schreibt strukturierte Logs mit Serilog:

Log-QuellePfad
Anwendungslogslogs\cookie-manager-YYYYMMDD.log
IIS Stdout-Logslogs\stdout_*.log
Windows Event LogEreignisanzeige → Anwendung

Hangfire Dashboard

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:

JobZeitplanBeschreibung
library-vulnerability-checkMontag 3:00 UhrNuGet-Pakete auf bekannte Schwachstellen prüfen, E-Mail bei Fund
Website Auto-ScansPro Website (Standard: 7 Tage)Automatische Nacht-Scans (2:00–4:00 Uhr), dynamisch geplant
Einstellungen
Scan-Einstellungen
Maximale Anzahl an Seiten aus der Sitemap (1-1000).
Maximale Wartezeit pro Seite (5-120 Sek.).
Wartezeit auf JavaScript-Cookies nach dem Laden (1-30 Sek.).
Kommagetrennte Pfade, wenn keine Sitemap gefunden wird.
E-Mail-Einstellungen
Name des E-Mail-Absenders.
E-Mail-Adresse des Absenders.
Unbekannte Cookies
Wie unbekannte Cookies in der Klaro-Konfiguration behandelt werden.
Neue Websites - Standardwerte
Vorgabewert für automatische Scans neuer Websites (1-168 Std.).