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 PoolsAdd 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 SitesAdd 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 WebsitesSnippetAnpassenConsent-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.jsonCors.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.).