Dotnet-core-2.0-Authentifizierung mehrere schemas Identität cookies und jwt
In dotnet core 1.1 asp, ich war in der Lage, zu konfigurieren und zu verwenden, Identität middleware, gefolgt von jwt-middleware, indem Sie Folgendes tun:
app.UseIdentity();
app.UseJwtBearerAuthentication(new JwtBearerOptions() {});
Dies hat sich nun geändert, dass wir die Umsetzung der middleware mit:
app.UseAuthentication();
Konfiguration der Einstellungen erfolgt über die ConfigureServices Abschnitt von Start.cs.
Gibt es einige Hinweise auf die Verwendung von Autorisierungs-schema ist in der migration-Dokumentation:
In 2.0-Projekte, Authentifizierung konfiguriert ist, über services. Jeder
Authentifizierungsschema ist eingetragen im ConfigureServices Methode
Startup.cs. Die UseIdentity Methode ersetzt, mit UseAuthentication.
Zusätzlich gibt es einen Verweis auf:
Festlegen Von Standard-Authentifizierungsschemas
In 1.x, die AutomaticAuthenticate und AutomaticChallenge Eigenschaften
wurden bestimmt, um auf einer einzigen Authentifizierung Schema. Es war
kein guter Weg, um dies durchzusetzen.In 2.0, diese beiden Eigenschaften wurden
entfernt als flags für die einzelnen AuthenticationOptions Instanz und
haben verschoben in die Basis AuthenticationOptions Klasse. Die Eigenschaften
kann konfiguriert werden, in der AddAuthentication Aufruf der Methode innerhalb der
ConfigureServices Methode von Startup.cs:Alternativ verwenden Sie eine überladene version der AddAuthentication
Methode, um mehr als eine Eigenschaft. In den folgenden überlastet
Methode B. das Standard-Schema festgelegt ist
CookieAuthenticationDefaults.AuthenticationScheme. Die Authentifizierung
das Schema kann alternativ angegeben werden, innerhalb Ihrer individuellen
[Autorisieren] Attribute oder Autorisierungsrichtlinien.
Ist es noch möglich in dotnet core 2.0 verwenden mehrere Authentifizierungs-schemas? Ich kann nicht den Richtlinien bezüglich des JWT Konfiguration "("Bearer" - schema), und nur Identität arbeitet derzeit mit beiden konfiguriert. Ich kann nicht finden keine Proben der mehreren Authentifizierungs-schemas.
Edit:
Habe ich Lesen Sie die Dokumentation, und jetzt verstehen Sie, dass die:
app.UseAuthentication()
fügt automatische Authentifizierung gegen ein Standard-schema. Identität konfiguriert die Standard-Schemata für Sie.
Habe ich bekommen, um das Problem mit dem, was scheint wie ein hack, die gegen die neue api folgt im Autostart.cs Konfigurieren:
app.UseAuthentication();
app.Use(async (context, next) =>
{
if (!context.User.Identity.IsAuthenticated)
{
var result = await context.AuthenticateAsync(JwtBearerDefaults.AuthenticationScheme);
if (result?.Principal != null)
{
context.User = result.Principal;
}
}
await next.Invoke();
});
Ist das der richtige Weg, dies zu tun, oder sollte ich die Ausnutzung der Rahmen -, DI-und Schnittstellen für benutzerdefinierte Implementierungen der IAuthenticationSchemeProvider?
Bearbeiten - Weitere details der Implementierung und wo es zu finden ist.
Den JWT Config kann hier gefunden werden, und ich bin mit Richtlinien definieren die Berechtigung, zu denen die akzeptiert auth-schema ist:
https://github.com/Arragro/ArragroCMS/blob/master/src/ArragroCMS.Management/Startup.cs
Custom-middleware ist immer noch implementiert. Der Auth-controller ist hier:
Es nutzt API-Keys generiert die app, um nur-Lesen-Zugriff auf die Daten. Sie finden die Implementierung einer Steuerung unter Verwendung der policy hier:
Ändern Sie die DB-Verbindungszeichenfolge zu Ihrem SQL Server, und führen Sie die Anwendung. Es migriert die DB automatisch und konfiguriert ein Administrator - ([email protected] - ArragroPassword1!). Dann gehen Sie auf die Registerkarte "Einstellungen" in der Menüleiste und klicken Sie auf "Konfigurieren der JWT ReadOnly-API-Key Einstellungen", um einen Schlüssel. In Briefträger, bekommen jwt token konfigurieren Sie eine neue Registerkarte, und setzen Sie es auf die POST an der folgenden Adresse:
http://localhost:5000/api/auth/readonly-token
Versorgung des headers: Content-Type: application/json
Versorgen den Körper:
{
"apiKey": "the api token from the previous step"
}
Kopieren Sie den token in der Antwort, und verwenden Sie dann die folgenden in postman:
http://localhost:5000/api/sitemap/flat
Authorization: "bearer - The token you received in the previous request"
Wird es funktionieren inititally, weil der custom-middleware. Kommentieren Sie den code oben erwähnt, und versuchen Sie es erneut und Sie erhalten eine 401.
Edit -@DonnyTian Antwort unten zeigt meine Lösung in seinen Kommentaren. Das problem, das ich hatte war Einstellung eine default-policy auf UseMvc, aber nicht der Versorgung des Schemas:
services.AddMvc(config =>
{
var defaultPolicy = new AuthorizationPolicyBuilder(new[] { JwtBearerDefaults.AuthenticationScheme, IdentityConstants.ApplicationScheme })
.RequireAuthenticatedUser()
.Build();
config.Filters.Add(new AuthorizeFilter(defaultPolicy));
config.Filters.Add(new AutoValidateAntiforgeryTokenAttribute());
config.Filters.Add(new ValidateModelAttribute());
});
Anschluss an die Beratung, das funktioniert, ohne zusätzliche middleware.
- teilen Sie Ihre JWT Konfigurations-code in der ConfigureServices.
- Der code für diese ist hier erhältlich: github.com/Arragro/ArragroCMS/blob/master/src/.... Aktuelle Umsetzung mit custom-middleware funktioniert, aber ich würde eher das schema der Umsetzung in der Politik/auth-Attribut
Du musst angemeldet sein, um einen Kommentar abzugeben.
Asp.Net Core 2.0 definitiv Unterstützung mehrerer Authentifizierungsschemas.
Eher als ein Hacker mit Hilfe von authenticate middleware, können Sie versuchen, geben Sie das schema in
Authorize
Attribut:Gab ich es versuchen und es funktionierte gut. Angenommen, Sie Hinzugefügt haben, die sowohl die Identität und JWT als unten:
Seit
AddIdentity()
bereits gesetzten cookie-Authentifizierung als Standard-schema, müssen wir festlegen, schema inAuthorize
Attribut-Controller. Für jetzt, ich habe keine Ahnung, wie das überschreiben der default-schema-festlegen vonAddIdentity()
oder vielleicht sollten wir besser nicht zu tun.Einer umgehen, erstellen Sie eine neue Klasse (Sie können es nennen, JwtAuthorize), ergibt sich aus
Authorize
und haben Träger als das Standard-schema, so dass Sie nicht haben, geben Sie es jedes mal.UPDATE
Fand die Möglichkeit zum überschreiben der Standard-Identität-Authentifizierung Schema!
Statt unter Zeile:
Unter überlast, legen Sie Standard-schema:
UPDATE 2
Wie bereits erwähnt in den Kommentaren, können Sie sowohl Identität und JWT auth von beiden vereinigen.
[Authorize(AuthenticationSchemes = "Identity.Application" + "," + JwtBearerDefaults.AuthenticationScheme)]
Habe ich diese Frage für die Lösung meines (ähnlichen) problem der Verbindung von Identität und Träger-Authentifizierung .Net-Core-2.0-Anwendung. Wichtig zu beachten ist, dass Sie brauchen, um hinzuzufügen
new[] { JwtBearerDefaults.AuthenticationScheme, IdentityConstants.ApplicationScheme
um das folgende Stück code:UND
Fügen Sie die Standard-Authentifizierung option:
In meine erste Lösung basierend auf dieser Frage habe ich nicht bemerkt, dass beide Veränderungen in meinem code waren nötig. Hoffentlich kann ich das speichern jemand die Stunden, die ich verschwendet 🙂
Sean Wildermuth hat blog-post auf die beiden cookie und jwt: https://wildermuth.com/2017/08/19/Two-AuthorizationSchemes-in-ASP-NET-Core-2
Er Ketten es so:
Basierend auf dem, was kevin reiche hier sagt http://www.whoiskevinrich.com/configuring-asp-net-core-2-0-authentication
War ich in der Lage, jwt als die Standard-Authentifizierungsmethode:
Getestet habe ich diese und war in der Lage zu entfernen (AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme) aus dem autorisieren Attribut erwähnt in donnytian post.