v1.7.21
Zurück zur ÜbersichtVorherige veröffentlichte Version: 1.7.20 (1. Oktober 2026)
Backend: .NET 10 + IIS / Linux nginx
Frontend: Angular 21
Ein Release für Sicherheit und Datenzugriff. Es schließt die Befunde einer vollständigen Sicherheitsprüfung des Frameworks und bringt OData auf dieselbe Berechtigungsstufe wie das CRUD. Kurz gefasst:
enableCookieAuthenticationakzeptiert einen dritten Wert,"signed": vom Server signiertes Cookie, mehrere Sitzungen pro Benutzer, Abmeldung pro einzelner Sitzung;- OData wendet Routen- und Spaltenberechtigungen sowie die Zeileneinschränkungen des Benutzers an und schreibt über das CRUD des Frameworks;
- persönliche Tokens verbinden Power BI, Excel und Skripte mit den OData-Endpunkten;
- die Option „Secure Upload“ der Upload-Spalten schützt die Dateien der Spalte wieder;
- Bearbeiten und Löschen beachten die Einschränkung pro Benutzer auch im CRUD der Oberfläche;
- Fehler zeigen dem Benutzer eine übersetzte Meldung mit einem Nachverfolgungscode, technische Details nur dem Superadmin.
Änderungen am Schema der Metadaten werden beim Start automatisch angewendet. Die Funktionen wurden mit den End-to-End-Tests auf SQL Server, MySQL, PostgreSQL und Oracle in den drei Modi von enableCookieAuthentication geprüft.
🔐 Authentifizierung und Sitzungen
- Drei Modi.
enableCookieAuthenticationistfalse,trueoder"signed". Mitfalseist der Benutzer derjenige, den das Browser-Cookie angibt: nur für die Entwicklung. Beim Start meldet eine[security]-Nachricht dies, der AppSettings-Editor beschreibt es und verlangt beim Speichern eine Bestätigung. Ein unbekannter Wert gilt als"signed", mit Warnung im Log. "signed". Der Server signiert das Cookiek-user(HMAC-SHA256, Ablauf innerhalb der Signatur): ein verändertes oder abgelaufenes Cookie gilt als nicht vorhanden. Derselbe Benutzer kann mehrere offene Sitzungen haben, jede mit eigener Kennung.- Abmeldung und Widerruf. Die Abmeldung schließt nur die Sitzung, von der sie ausgeht, Kopien des Cookies eingeschlossen. Die Abmeldung eines Benutzers durch einen Administrator, das Zurücksetzen und das Ändern des Passworts schließen alle Sitzungen dieses Benutzers in seiner Firma.
- Maximale Dauer. Mit
signedSessionMaxLifetimeHours(Standard 24,0= ohne Grenze) läuft eine signierte Sitzung in diesem Alter ab dem Login ab, auch bei ständiger Nutzung. - Signaturschlüssel.
cookie-signing-keywird beim ersten Start erzeugt und inappsettings.jsongespeichert. Beim Start zeigt das Log den Fingerabdruck des Schlüssels (nie den Schlüssel) und warnt, wenn der Schlüssel nicht gespeichert wurde. - Auf dem Server geprüfte Aufrufe. Mit
falseträgt das Cookie keine gefälschten Rechte mehr (Administrator, Rolle, Firma): der Benutzer wird aus der Datenbank neu gelesen.
🔗 OData
- Berechtigungen. Jedes Entity Set verlangt die Leseberechtigung auf der Route. Eine dem Benutzer verweigerte Spalte, die in
$select,$filter,$orderbyoder$expandgenannt wird, ergibt 403; sonst kommt sie leer zurück. - Zeileneinschränkungen. Die Abfrage geht vom selben SELECT wie das CRUD aus, mit der Einschränkung pro Benutzer, Rolle oder Firma, dem Standardfilter und dem logischen Löschen.
$filter,$orderby,$skip,$topund$countwerden außen angewendet und können nur einschränken:or 1 eq 1erweitert das Ergebnis nicht. $expand. Erlaubt zu lesbaren Routen ohne Zeileneinschränkungen und ohne logisches Löschen; sonst 403.- Schreibzugriffe.
POST,PATCHundDELETElaufen überinsertRecord,updateRecordunddeleteRecord: Berechtigungen, nicht bearbeitbare Spalten, Trigger, Protokollfelder, Change Log, Workflows und logisches Löschen gelten wie in der Oberfläche. Eine für den Benutzer verborgene Zeile ergibt 404. - Mehrere Firmen. Die Datenverbindung ist die der Firma des Benutzers, wie im CRUD.
- Discovery.
/odata,/odata/$metadataund/odata/openapi.jsonverlangen eine Sitzung. MitodataPublicMetadata=truesind sie wieder öffentlich; die Daten bleiben geschützt. - Persönliche Tokens. Mit
apiTokensEnabled=trueerstellt jeder Benutzer im Benutzermenü („API-Token“) Tokenswuic_pat_…mit Namen, Ablauf (Standard 90 Tage, höchstensapiTokenMaxLifetimeDays) und Nur-Lese- oder auch Schreibberechtigung. Sie gelten nur auf/odata, mit den Berechtigungen des Eigentümers. Power BI und Excel verwenden sie als Passwort mit „Basic“-Anmeldedaten; Skripte mitAuthorization: Bearer. Das Token wird nur einmal angezeigt; der Superadmin sieht und widerruft die Tokens aller.
🛡️ Sicherheit
Best-Effort-Hardening auf der ganzen Oberfläche: Prüfungen der Werte, die in Abfragen landen (Sortierungen, Operatoren, Aggregate, Schlüssel, numerische Filter), auf den vier Providern angeglichen; Upload- und Berichtspfade auf ihre Ordner beschränkt; Verwaltungsfunktionen (Berichtsdesigner, Entfernen und Scaffolding von Berichten, Spaltenreihenfolge, Neustart, OData-Scaffold) dem in der Datenbank geprüften Superadmin vorbehalten; Workflow-E-Mails nur von Benutzern, die den Workflow ausführen dürfen; Beispieldaten der Werkzeuge für KI-Assistenten nur für den Superadmin und nie mit Spalten für Anmeldedaten; Schutzmechanismen für Benutzer und Rollen an die Tabelle gebunden, nicht an den Routennamen; öffentlicher Lizenzschlüssel im Paket eingebettet.
📎 Upload
- „Secure Upload“ pro Spalte. Die Dateien einer Spalte mit
upload_securelassen sich nur mit gültiger Sitzung und für den Benutzer sichtbarer Spalte lesen, sowohl über/uploadals auch über/api/UploadImage. Die Dateien der anderen Spalten bleiben öffentlich. Spalten, die die Datei in der Datenbank speichern, sind über/api/UploadImagegeschützt. - Dateinamen. Namen mit inneren Punkten (
rechnung-acme.com.pdf) werden akzeptiert; Namen mit vom Server ausführbaren Endungen bleiben auch in der Mitte abgelehnt (foto.aspx.png).
🚦 Fehler
Der Benutzer erhält eine übersetzte Meldung mit einem Nachverfolgungscode (Schaltfläche „Code kopieren“ im Fehlerdialog). Derselbe Code wird mit dem vollständigen Stack in _error__logs gespeichert. SQL, Stacks und interne Meldungen erreichen nur den Superadmin. Übersetzungen der neuen Fehlermeldungen werden beim Start automatisch ergänzt.
🐛 Wichtige Fehlerbehebungen
- Einschränkung pro Benutzer beim Bearbeiten und Löschen. UPDATE und DELETE des CRUD enthielten nur den Schlüssel: wer die ID kannte, konnte die Zeile eines anderen Benutzers bearbeiten. Jetzt muss die Zeile zu denen gehören, die der Benutzer sieht, sonst 403
errors.auth.route_read_forbidden. - Standardfilter mit Filtern in OR. Mit dem Operator OR verschwand der Standardfilter der Route, und das Grid zeigte die Zeilen, die es verbergen sollte. Jetzt bleibt er in AND.
- Oracle. Booleans werden auch bei Spalten mit booleschem UI-Typ, in Filtern und in Parametern gespeicherter Prozeduren als 1/0 geschrieben; Funktionen werden im richtigen Schema von Prozeduren unterschieden; OData auf dem Datenschema auch mit dem Benutzer
SYSTEM(vorher sporadische ORA-00942-Fehler). - PostgreSQL und Oracle. Das Einfügen mit einem Identity-Schlüssel, den der Client nicht sendet, schlägt nicht mehr fehl; Berichte wenden Berechtigungen und Filter des Benutzers wie auf SQL Server und MySQL an.
- Erster Start unter IIS. Die Erstkonfiguration liefert nach erfolgreicher Installation kein 500 mehr: die Migrationen werden beim Neustart des Workers abgeschlossen.
- Spreadsheet und Synchronisierung. Mit aktivem Filter trafen Bearbeiten und Löschen die falsche Zeile; eine Auswahl über die Seite hinaus erreicht die Datensätze der folgenden Seiten nicht mehr; das Batch-Speichern im Kanban und die Offline-Synchronisierung wiederholen nur, was fehlgeschlagen ist.
- Menü. Die Leiste erscheint mit bereits übersetzten Beschriftungen, ohne kurz die Schlüssel zu zeigen.
📦 Aktualisierte Pakete
| Paket | Von | Auf |
|---|---|---|
WuicCore |
1.7.20 | 1.7.21 |
Wuic.Webcore |
1.7.20 | 1.7.21 |
WuicOData |
1.7.20 | 1.7.21 |
RuntimeEfCore |
1.7.20 | 1.7.21 |
Wuic.MySqlProvider |
1.7.20 | 1.7.21 |
Wuic.PostgresProvider |
1.7.20 | 1.7.21 |
Wuic.OracleProvider |
1.7.20 | 1.7.21 |
wuic-framework-lib (npm) |
1.7.20 | 1.7.21 |
🔧 Empfohlene Schritte beim Update
- Cookie-Modus: in der Produktion
enableCookieAuthenticationauf"signed"(odertrue) setzen;falseist nur für die Entwicklung. - Mehrere Instanzen hinter einem Load Balancer: denselben
cookie-signing-keyin alle Instanzen kopieren; mit unterschiedlichen Schlüsseln gilt eine Sitzung nur auf der Instanz, die sie erzeugt hat. Im Log prüfen, dass der Fingerabdruck übereinstimmt. - OData-Clients: Clients, die
$metadataohne Sitzung gelesen haben, müssen sich anmelden, oderodataPublicMetadata=truesetzen. OData-Schreibzugriffe führen jetzt Trigger und Protokollierung des CRUD aus und setzen auf Routen mit logischem Löschen das Kennzeichen, statt die Zeile zu löschen. md_service_apply_default_filter: veraltet. Der Standardfilter gilt immer, auch über OData.- Lizenz: die Überschreibung des Maschinen-Fingerabdrucks wird nur über die Umgebungsvariable
WUIC_LICENSE_MACHINE_FINGERPRINTgesetzt; die Schlüssellicense-machine-fingerprint-overrideundlicense-public-key-peminappsettings.jsonwerden ignoriert. - API-Tokens: um Power BI, Excel oder Skripte anzubinden, im AppSettings-Editor
apiTokensEnabled=true(und bei BedarfapiTokenMaxLifetimeDays) setzen.