NET 7.0 Preview 5: JWT-Vereinfachungen und flexibleres Vererbungsmapping
Die fünfte Preview von .NET 7.0 bietet flexibleres OR-Mapping für Vererbungshiearchien sowie Vereinfachungen beim Verwenden von JSON Web Token in ASP.NET Core.
- Dr. Holger Schwichtenberg
In Entity Framework Core 7.0 ab Preview 5 können Entwicklerinnen und Entwickler nun per Annotation oder Fluent-API die Table-per-Concrete-Type-Vererbung (TPC/TPCT) erzwingen. Bei dieser Form der Vererbung wird eine Vererbungshierarchie von Entitätsklassen, bei der es eine Basisklasse ohne konkrete Instanzen gibt, auf mehrere Tabellen, aber nur für die abgeleiteten Klassen abgebildet, die dann auch die Eigenschaften der Basisklasse umfassen. Dadurch werden Joins beim Datenabruf vermieden (s. Abb. 1).
Table-per-Concrete-Type-Vererbung
Das TPC-Vererbungsmodell gab es im klassischen Entity Framework seit der ersten Version, Entity Framework Core in den Version 1.0 bis 6.0 machte TPC aber nur in einigen Fällen automatisch, wenn die Basisklasse explizit als "abstract" deklariert war. In Entity Framework Core 1.0 bis 3.1 war der Standard die Table-per-Hierarchy-Vererbung (TPH), bei der alle Klassen einer Vererbungshierarchie in einer einzigen Tabelle landen und dort mit einer "Diskriminator" genannten Spalte unterschieden wurden. In der darauffolgenden Version 5.0 hatte Microsoft Table-per-Type (TPT) wieder eingeführt, bei der es für jede Klasse eine Tabelle gibt. In einem Blogeintrag beschreibt Jeremy Likness ausführlich die Konfiguration von TPH, TPT und TPC an einem Beispiel. Die wilde Mischung der verschiedenen Mappingstrategien (TPH, TPC, TPT) in einer Vererbungshierarchie, die im klassischen Entity Framework möglich war, will Microsoft aber in Entity Framework Core nicht mehr unterstützen.
Vereinfachungen für JWT
In ASP.NET Core reagiert Microsoft in der Version 7.0 Preview 5 auf Nutzerkritik, dass die Konfiguration von Authentifizierung und Autorisierung bisher zu kompliziert sei. Die neue Version bietet daher (zunächst nur für JSON Web Token – JWT) eine neue, im folgenden Listing dargestellte Syntaxform an, bei der man AddJwtBearer()
direkt in dem neuen Property Authentication
der Klasse WebApplicationBuilder
aufrufen kann:
WebApplicationBuilder builder = WebApplication.Create(args);
builder.Authentication.AddJwtBearer();
var app = builder.Build();
app.MapGet("/", () => "Hallo Welt!");
app.MapGet("/aktion1", (ClaimsPrincipal user) => $"Hallo {user.Identity?.Name}.")
.RequireAuthorization();
app.MapGet("/aktion2", () => "Claim 'Scope' wurde uebergeben!")
.RequireAuthorization(p => p.RequireClaim("scope", "myapi:secrets"));
app.Run();
Verdreifachte Konfiguration von Authentifizierung und Autorisierung – hier in Verbindung mit dem ASP.NET Core Minimal API
Zudem können Entwicklerinnen und Entwickler nun Einstellungen für die JWT-Authentifizierung in der Anwendungskonfigurationsdatei festlegen. Diese Konfiguration wird automatisch von AddJwtBearer()
beim Start des Serverprozesses eingelesen:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"Authentication": {
"DefaultScheme" : "JwtBearer",
"Schemes": {
"JwtBearer": {
"Audiences": [ "http://localhost:5000", "https://localhost:5001" ],
"ClaimsIssuer": "dotnet-user-jwts"
}
}
}
}
Festlegen der JWT-Konfiguration in der appsettings.Development.json.
Zur Erstellung von JSON Web Token zum Testen bietet Microsoft ein neues Kommandozeilenwerkzeug "user-jwts". Nach einer notwendigen Initialisierung via:dotnet user-jwts create
dotnet user-secrets init
können Entwicklerinnen dann mit der Anweisung create
neue Token anlegen, beispielsweise:MyWebApi$ dotnet user-jwts create --name HolgerSchwichtenberg --scope "myapi:secrets"
Parameterlisten kapseln
Für die Web-APIs in ASP.NET Core bietet Microsoft nun eine neue Syntaxform für Parameterlisten an. Anstelle von:
app.MapGet("/categories/{categoryId}/products", (int categoryId, int pageSize,
int page, ILogger<Program> logger, MyDb db) =>
{
...
});
können Entwickler die Parameterliste auch in einen eigenen Typ auslagern:
record struct ProductRequest(
int CategoryId,
int PageSize,
int Page,
ILogger<ProductRequest> Logger,
MyDb Db);
und mit [AsParameters]
in der Operation verwenden:
app.MapGet("/categories/{categoryId}/products",
([AsParameters] ProductRequest req) =>
{
...
});
Verbesserungen bei den Basisklassen
Die Basisklasse System.IO.Stream
bietet zwei neue Methoden ReadExactly()
und ReadAtLeast()
in Ergänzung zu dem altbekannten Read()
. ReadExactly()
liest garantiert genau die Anzahl der angeforderten Bytes. ReadAtLeast()
liest mindestens die Anzahl der angeforderten Bytes. Es kann mehr lesen, wenn mehr Daten verfügbar sind. Das reicht dann bis zur Größe des Puffers. In beiden Fällen gilt: Falls der Stream endet, bevor die angeforderten Bytes gelesen wurden, wird der Laufzeitfehler EndOfStreamException
erzeugt. Bei ReadAtLeast()
können die Aufrufer den Laufzeitfehler durch einen Parameter throwOnEndOfStream: false
unterdrücken.
Für den in .NET 7.0 Preview 2 eingeführten Quellcodegenerator für reguläre Ausdrücke gibt es nun ein Refactoring in Visual Studio, das Entwicklern bei der Verwendung eines regulären Ausdrucks in der Klasse Regex anbietet, dies in die Syntax des Quellcodegenerators zu überführen (s. Abb. 2).
In der JSON-Bibliothek System.Text.Json
bietet Microsoft Unterstützung für Polymorphismus mit der neuen Annotation [JsonDerivedType]
. Die bereits seit .NET 6.0 als Preview verfügbaren neuen Schnittstellen und Klassen für generische Mathematik hat Microsoft weiterentwickelt. Die Neuerungen werden in einem Blogeintrag ausführlich erklärt. Im Bereich Performance will Microsoft in .NET 7.0 Preview 5 den Aufruf von Methoden und Properties per Reflection um den Faktor 3 bis 4 verbessert haben. Und in der Machine-Learning-Bibliothek ML.NET gibt es jetzt eine neue API zur Klassifizierung von Texten.
Visual Studio-Updates
Zeitgleich mit .NET 7.0 Preview 5 ist die Version 17.3 Preview 2.0 von Visual Studio 2022 erschienen. Dies ist die erste Version von Visual Studio, die zumindest in Teilen auf Arm64-Prozessoren läuft. Die erste Version bietet aber auf Arm64-Geräten nur die Workloads "Desktop development with C++" (in Verbindung mit dem MSBuild-Werkzeug), ".NET desktop development" (Windows Forms, WPF) und "ASP.NET and Web development". Die neue Version von Visual Studio bietet zudem mit "Audio Clues" die Möglichkeit, Geräusche bei bestimmten Übersetzungs- und Debugger-Ereignissen abzuspielen (s. Abb. 3).
Die in vorherigen Updates eingeführte neue "All-In-One Search" bietet ab jetzt für gefundene Dateien, Klassen und Klassenmitglieder auch eine Vorschaufunktion des Codes, in der man auch direkt Code ändern kann (s. Abb. 4). Entwickler für Apple-Geräte können nun unter Tool\Options im Bereich "Apple Account" ihren Schlüssel für den Apple App Store hinterlegen, was das Deployment in den App Store vereinfacht.
Ausblick
Die fertige Version von .NET 7.0 ist für 8. November 2022 angekündigt und soll Support bis Mai 2024 bekommen. Seit letzter Woche nennt Microsoft diese Zwischenversionen nicht mehr "Current Release", sondern bezeichnet sie mit "Short Term Support (STS)". Diese Änderung ist aber noch nicht überall umgesetzt, so zum Beispiel auch nicht auf der Seite ".NET and .NET Core Support Policy".
Eine fertige Version von Visual Studio 2022 Version 17.3 ist für August 2022 zu erwarten, weil Microsoft dann die Werkzeuge für .NET MAUI, die auch nach dem Release von .NET MAUI am 23. Mai noch in Beta-Stadium sind, ebenfalls stabil haben will.
(fms)