Mit Core 1.1 befolgte @ Blowdart den Rat und implementierte eine benutzerdefinierte Middleware:
https://stackoverflow.com/a/31465227/29821
Es hat so funktioniert:
- Middleware lief. Habe ein Token aus den Anforderungsheadern aufgenommen.
- Das Token wurde überprüft und, falls gültig, eine Identität (ClaimsIdentity) erstellt, die mehrere Ansprüche enthielt, die dann über HttpContext.User.AddIdentity () hinzugefügt wurden.
- In ConfigureServices using services.AddAuthorization habe ich eine Richtlinie hinzugefügt, die den Anspruch erfordert, der von der Middleware bereitgestellt wird.
- In den Controllern / Aktionen würde ich dann [Authorize (Roles = "eine Rolle, die die Middleware hinzugefügt hat") verwenden]
Dies funktioniert etwas mit 2.0, außer dass, wenn das Token nicht gültig ist (Schritt 2 oben) und der Anspruch nie hinzugefügt wird, "Es wurde kein Authentifizierungsschema angegeben und es wurde kein DefaultChallengeScheme gefunden."
Jetzt lese ich, dass sich die Authentifizierung in 2.0 geändert hat:
https://docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/identity-2x
Was ist der richtige Weg für mich, um dasselbe in ASP.NET Core 2.0 zu tun? Ich sehe kein Beispiel für eine wirklich benutzerdefinierte Authentifizierung.
Antworten:
Nach einem langen Tag, an dem versucht wurde, dieses Problem zu lösen, habe ich endlich herausgefunden, wie Microsoft benutzerdefinierte Authentifizierungshandler für das neue Single-Middleware-Setup in Core 2.0 erstellen soll.
Nachdem ich einige Dokumentationen zu MSDN durchgesehen hatte, fand ich eine Klasse namens
AuthenticationHandler<TOption>
, die dieIAuthenticationHandler
Schnittstelle implementiert .Von dort fand ich eine vollständige Codebasis mit den vorhandenen Authentifizierungsschemata unter https://github.com/aspnet/Security
In einem dieser Beispiele wird gezeigt, wie Microsoft das JwtBearer-Authentifizierungsschema implementiert. ( https://github.com/aspnet/Security/tree/master/src/Microsoft.AspNetCore.Authentication.JwtBearer )
Ich habe den größten Teil dieses Codes in einen neuen Ordner kopiert und alle Dinge gelöscht, die damit zu tun haben
JwtBearer
.In der
JwtBearerHandler
Klasse (die erweitert wirdAuthenticationHandler<>
) gibt es eine Überschreibung fürTask<AuthenticateResult> HandleAuthenticateAsync()
Ich habe unsere alte Middleware zum Einrichten von Ansprüchen über einen benutzerdefinierten Tokenserver hinzugefügt und hatte immer noch Probleme mit Berechtigungen. Ich habe nur ein
200 OK
statt eines ausgegeben,401 Unauthorized
wenn ein Token ungültig war und keine Ansprüche eingerichtet wurden.Mir wurde klar, dass ich überschrieben hatte,
Task HandleChallengeAsync(AuthenticationProperties properties)
was aus irgendeinem Grund zum Festlegen von Berechtigungen[Authorize(Roles="")]
in einem Controller verwendet wird.Nach dem Entfernen dieser Überschreibung hatte der Code funktioniert und erfolgreich eine ausgelöst,
401
wenn die Berechtigungen nicht übereinstimmten.Die wichtigste Erkenntnis daraus ist, dass Sie jetzt keine benutzerdefinierte Middleware verwenden können, sondern diese über implementieren
AuthenticationHandler<>
müssen und dasDefaultAuthenticateScheme
undDefaultChallengeScheme
bei der Verwendung festlegen müssenservices.AddAuthentication(...)
.Hier ist ein Beispiel, wie dies alles aussehen sollte:
Fügen Sie in Startup.cs / ConfigureServices () Folgendes hinzu:
Fügen Sie in Startup.cs / Configure () Folgendes hinzu:
Erstellen Sie eine neue Datei CustomAuthExtensions.cs
Erstellen Sie eine neue Datei CustomAuthOptions.cs
Erstellen Sie eine neue Datei CustomAuthHandler.cs
quelle
DefaultAuthenticateScheme
undDefaultChallengeScheme
? Ich verstehe nicht, warum beide verwendet werden? und was ist der Unterschied zwischen ihnen.AuthExtension
sich imMicrosoft.Extensions.DependencyInjection
Namespace befinden. Siehe dieses Beispiel: github.com/aspnet/Security/blob/rel/2.0.0/src/…Wie der Artikel, auf den Sie verweisen, zeigt, gibt es erhebliche Änderungen in der Identität von Core 1.x zu Core 2.0. Die wichtigste Änderung besteht darin, sich vom Middleware-Ansatz zu lösen und die Abhängigkeitsinjektion zum Konfigurieren benutzerdefinierter Dienste zu verwenden. Dies bietet viel mehr Flexibilität beim Anpassen der Identität für komplexere Implementierungen. Sie möchten sich also von dem oben erwähnten Middleware-Ansatz lösen und sich den Diensten zuwenden. Befolgen Sie die Migrationsschritte im Artikel, auf den verwiesen wird, um dieses Ziel zu erreichen. Ersetzen Sie zunächst app.UseIdentity durch app.UseAuthentication . UseIdentity wird abgeschrieben und in zukünftigen Versionen nicht mehr unterstützt. Ein vollständiges Beispiel zum Einfügen einer benutzerdefinierten Anspruchstransformation und zum Durchführen einer Autorisierung für den AnspruchDiesen Blog-Beitrag anzeigen .
quelle