Zum Inhalt

Datenschutz und personenbezogene Daten

Jedes Modul, das Daten über einen Benutzer speichert, liefert sie über IPersonalDataContributor: einen benannten JSON-Abschnitt für den Export und einen Löschschritt für das Löschen des Kontos.

internal sealed class TaskPersonalData(CoworkeeDbContext db) : IPersonalDataContributor
{
    public string Section => "tasks";

    public async Task<object?> ExportAsync(PersonalDataSubject subject, CancellationToken ct) =>
        await db.Set<TaskItem>().Where(t => t.AssigneeId == subject.UserId).Select(t => new { t.Title, t.DueAt }).ToListAsync(ct);

    public Task EraseAsync(PersonalDataSubject subject, CancellationToken ct) =>
        db.Set<TaskItem>().Where(t => t.AssigneeId == subject.UserId).ExecuteUpdateAsync(s => s.SetProperty(t => t.AssigneeId, (Guid?)null), ct);
}

services.AddScoped<IPersonalDataContributor, TaskPersonalData>();

PersonalDataSubject enthält Benutzer-ID, Mandant und E-Mail-Adresse und wird gelesen, bevor ein Contributor läuft; die Reihenfolge spielt also keine Rolle. Ein Abschnitt, der null liefert, fehlt im Export. Das Löschen läuft in einer Transaktion; direkte Aufrufe von ExecuteDelete/ExecuteUpdate schreiben keine Audit-Einträge mit den alten Werten.

Eingebaute Abschnitte

Abschnitt Modul Löschen
profile Identity: Name, E-Mail, Telefon, Adresse, Bild, Rollen, Gruppen, externe Anmeldungen Benutzer gelöscht (Rollen, Claims, Anmeldungen, Mitgliedschaften per Kaskade), eigene Berechtigungen entfernt, Werte im Audit-Verlauf des Benutzers durch *** ersetzt
settings Einstellungen: Werte mit Benutzerbereich (Geheimnisse als ***) gelöscht
notifications Benachrichtigungen gelöscht, samt Digest-Status
chat Chat: gesendete und empfangene Nachrichten beide Seiten der Unterhaltungen gelöscht
aiToolCalls KI: Protokoll der Tool-Aufrufe (der Assistent speichert keinen Chatverlauf) gelöscht
mails Mailversand: Mails an die Adresse, ohne Inhalt gelöscht
activity Audit: was der Benutzer geändert hat bleibt; der Verlauf nennt den Handelnden nur per ID, die danach auf niemanden mehr zeigt
social Kommentare, Tags und Bewertungen: eigene Kommentare und Bewertungen gelöscht, Antworten auf die Kommentare ebenso
files Dateien: hochgeladene Dateien (Name, Typ, Größe) bleiben, sie gehören in die Ordner der Organisation
signIns Auth-Server: freigegebene Clients Freigaben und Tokens gelöscht, jede Sitzung endet

Datenbank-Backups behalten frühere Daten, bis sie rotiert werden.

Endpunkte

Endpunkt Wer Wirkung
GET /api/v1/identity/me/personal-data der Benutzer JSON-Objekt mit einer Eigenschaft pro Abschnitt
POST /api/v1/identity/me/delete mit { "email": "…" } der Benutzer löscht alles; die Adresse muss zum Konto passen (sonst 400)
DELETE /api/v1/identity/users/{id} Identity.Users.Manage dasselbe für einen anderen Benutzer des Mandanten; nur Administratoren löschen Administratoren

Der letzte aktive Administrator lässt sich nicht löschen (409 identity.last_admin). Keiner dieser Requests steht dem KI-Assistenten zur Verfügung.

Der Export entsteht synchron: Die Daten eines Benutzers sind klein, und es bleibt nichts im Speicher zurück, das eigenen Ablauf und eigenes Aufräumen bräuchte. Erst wenn einzelne Benutzer viele Megabyte erreichen, lohnt sich ein Hintergrundjob.

Im Client

Die Kontoseite hat einen Reiter Datenschutz: Daten als personal-data.json herunterladen oder das Konto löschen, nachdem die eigene E-Mail-Adresse eingegeben wurde; danach meldet der Client ab. Administratoren finden Delete user auf der Detailseite eines Benutzers.