Ich arbeite mit der ASP.NET Core-Anwendung. Ich versuche, die Token-basierte Authentifizierung zu implementieren, kann jedoch nicht herausfinden, wie das neue Sicherheitssystem für meinen Fall verwendet wird. Ich habe Beispiele durchgesehen, aber sie haben mir nicht viel geholfen. Sie verwenden entweder die Cookie-Authentifizierung oder die externe Authentifizierung (GitHub, Microsoft, Twitter).
Was mein Szenario ist: angularjs Anwendung sollte eine /token
URL anfordern, die Benutzername und Passwort übergibt. WebApi sollte den Benutzer autorisieren und zurückgeben, access_token
was von der anglejs-App bei folgenden Anforderungen verwendet wird.
Ich habe einen großartigen Artikel über die Implementierung genau dessen gefunden, was ich in der aktuellen Version von ASP.NET - Token Based Authentication mit ASP.NET Web API 2, Owin und Identity benötige . Für mich ist jedoch nicht klar, wie ich dasselbe in ASP.NET Core tun soll.
Meine Frage lautet: Wie konfiguriere ich die ASP.NET Core WebApi-Anwendung für die tokenbasierte Authentifizierung?
Antworten:
Update für .Net Core 3.1:
David Fowler (Architekt des ASP .NET Core-Teams) hat eine unglaublich einfache Reihe von Aufgabenanwendungen zusammengestellt, einschließlich einer einfachen Anwendung, die JWT demonstriert . Ich werde bald seine Updates und seinen simplen Stil in diesen Beitrag aufnehmen.
Aktualisiert für .Net Core 2:
In früheren Versionen dieser Antwort wurde RSA verwendet. Es ist wirklich nicht notwendig, wenn derselbe Code, der die Token generiert, auch die Token überprüft. Wenn Sie jedoch die Verantwortung verteilen, möchten Sie dies wahrscheinlich immer noch mit einer Instanz von tun
Microsoft.IdentityModel.Tokens.RsaSecurityKey
.Erstellen Sie einige Konstanten, die wir später verwenden werden. Folgendes habe ich getan:
Fügen Sie dies zu Ihren Startup.cs hinzu
ConfigureServices
. Wir werden die Abhängigkeitsinjektion später verwenden, um auf diese Einstellungen zuzugreifen. Ich gehe davon aus, dass SieauthenticationConfiguration
einConfigurationSection
oder einConfiguration
Objekt sind, sodass Sie eine andere Konfiguration für Debug und Produktion haben können. Stellen Sie sicher, dass Sie Ihren Schlüssel sicher aufbewahren! Es kann eine beliebige Zeichenfolge sein.Ich habe gesehen, wie andere Antworten andere Einstellungen geändert haben, wie z
ClockSkew
. Die Standardeinstellungen sind so festgelegt, dass sie für verteilte Umgebungen funktionieren, deren Uhren nicht genau synchron sind. Dies sind die einzigen Einstellungen, die Sie ändern müssen.Authentifizierung einrichten. Sie sollten diese Zeile vor jeder Middleware haben, die Ihre
User
Informationen benötigt , wie zapp.UseMvc()
.Beachten Sie, dass dies nicht dazu führt, dass Ihr Token mit dem
SignInManager
oder etwas anderem ausgegeben wird. Sie müssen Ihren eigenen Mechanismus für die Ausgabe Ihres JWT bereitstellen - siehe unten.Möglicherweise möchten Sie eine angeben
AuthorizationPolicy
. Auf diese Weise können Sie Controller und Aktionen angeben, die nur Bearer-Token als Authentifizierung verwenden[Authorize("Bearer")]
.Hier kommt der schwierige Teil: das Erstellen des Tokens.
Dann in Ihrem Controller, wo Sie Ihr Token wollen, so etwas wie das Folgende:
Hier gehe ich davon aus, dass Sie bereits einen Schulleiter haben. Wenn Sie Identität verwenden, können Sie
IUserClaimsPrincipalFactory<>
IhreUser
in eine verwandelnClaimsPrincipal
.So testen Sie es : Holen Sie sich ein Token und fügen Sie es in das Formular unter jwt.io ein . Mit den oben angegebenen Anweisungen können Sie auch das Geheimnis Ihrer Konfiguration verwenden, um die Signatur zu validieren!
Wenn Sie dies in einer Teilansicht auf Ihrer HTML-Seite in Kombination mit der Nur-Träger-Authentifizierung in .Net 4.5 gerendert haben, können Sie jetzt a verwenden
ViewComponent
, um dasselbe zu tun. Es ist größtenteils das gleiche wie der obige Controller-Aktionscode.quelle
IOptions<OAuthBearerAuthenticationOptions>
, um die Optionen zu verwenden. Die direkte Verwendung eines Optionsobjekts wird aufgrund der benannten Konfiguration, die vom Optionsmodell-Framework unterstützt wird, nicht unterstützt.Ausgehend von Matt Dekreys fabelhafter Antwort habe ich ein voll funktionsfähiges Beispiel für die tokenbasierte Authentifizierung erstellt, das gegen ASP.NET Core (1.0.1) arbeitet. Den vollständigen Code finden Sie in diesem Repository auf GitHub (alternative Zweige für 1.0.0-rc1 , Beta8 , Beta7) ). , die wichtigsten Schritte sind:
Generieren Sie einen Schlüssel für Ihre Anwendung
In meinem Beispiel generiere ich bei jedem Start der App einen zufälligen Schlüssel. Sie müssen einen generieren, irgendwo speichern und Ihrer Anwendung zur Verfügung stellen. In dieser Datei erfahren Sie, wie ich einen zufälligen Schlüssel generiere und wie Sie ihn aus einer JSON-Datei importieren können . Wie in den Kommentaren von @kspearrin vorgeschlagen, scheint die Datenschutz-API ein idealer Kandidat für die "korrekte" Verwaltung der Schlüssel zu sein, aber ich habe noch nicht herausgefunden, ob dies möglich ist. Bitte senden Sie eine Pull-Anfrage, wenn Sie es ausarbeiten!
Startup.cs - ConfigureServices
Hier müssen wir einen privaten Schlüssel laden, mit dem unsere Token signiert werden sollen, mit dem wir auch die Token überprüfen, wenn sie präsentiert werden. Wir speichern den Schlüssel in einer Variablen auf Klassenebene,
key
die wir in der folgenden Configure-Methode wiederverwenden. TokenAuthOptions ist eine einfache Klasse, die die Signaturidentität, die Zielgruppe und den Aussteller enthält, die wir im TokenController zum Erstellen unserer Schlüssel benötigen.Wir haben auch eine Autorisierungsrichtlinie eingerichtet, die es uns ermöglicht, sie
[Authorize("Bearer")]
auf den Endpunkten und Klassen zu verwenden, die wir schützen möchten.Startup.cs - Konfigurieren
Hier müssen wir die JwtBearerAuthentication konfigurieren:
TokenController
Im Token-Controller benötigen Sie eine Methode zum Generieren signierter Schlüssel mit dem in Startup.cs geladenen Schlüssel. Wir haben eine TokenAuthOptions-Instanz in Startup registriert, daher müssen wir diese in den Konstruktor für TokenController einfügen:
Dann müssen Sie das Token in Ihrem Handler für den Anmeldeendpunkt generieren. In meinem Beispiel nehme ich einen Benutzernamen und ein Kennwort und überprüfe diese mithilfe einer if-Anweisung. Der Schlüssel, den Sie tun müssen, ist jedoch, Ansprüche zu erstellen oder zu laden -basierte Identität und generieren Sie das Token dafür:
Und das sollte es sein. Fügen
[Authorize("Bearer")]
Sie einfach eine Methode oder Klasse hinzu, die Sie schützen möchten, und Sie sollten eine Fehlermeldung erhalten, wenn Sie versuchen, ohne vorhandenes Token darauf zuzugreifen. Wenn Sie einen 401-Fehler anstelle eines 500-Fehlers zurückgeben möchten, müssen Sie einen benutzerdefinierten Ausnahmebehandler registrieren, wie ich ihn in meinem Beispiel hier habe .quelle
Sie können sich die OpenId Connect-Beispiele ansehen, die veranschaulichen, wie mit verschiedenen Authentifizierungsmechanismen umgegangen wird, einschließlich JWT-Token:
https://github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Samples
Wenn Sie sich das Cordova Backend-Projekt ansehen, sieht die Konfiguration für die API folgendermaßen aus:
Die Logik in /Providers/AuthorizationProvider.cs und der RessourceController dieses Projekts sind ebenfalls einen Blick wert;).
Alternativ können Sie auch den folgenden Code verwenden, um Token zu validieren (es gibt auch ein Snippet, damit es mit signalR funktioniert):
Für die Ausgabe von Token können Sie die openId Connect-Serverpakete wie folgt verwenden:
BEARBEITEN: Ich habe eine Einzelseitenanwendung mit tokenbasierter Authentifizierungsimplementierung unter Verwendung des Aurelia-Front-End-Frameworks und des ASP.NET-Kerns implementiert. Es besteht auch eine dauerhafte Verbindung mit Signal R. Ich habe jedoch keine DB-Implementierung durchgeführt. Code kann hier eingesehen werden: https://github.com/alexandre-spieser/AureliaAspNetCoreAuth
Hoffe das hilft,
Beste,
Alex
quelle
Schauen Sie sich OpenIddict an - es ist ein neues Projekt (zum Zeitpunkt des Schreibens), mit dem die Erstellung von JWT-Token und Aktualisierungstoken in ASP.NET 5 einfach konfiguriert werden kann. Die Validierung der Token wird von anderer Software durchgeführt.
Angenommen, Sie verwenden
Identity
mitEntity Framework
, ist die letzte Zeile das, was Sie IhrerConfigureServices
Methode hinzufügen würden :In
Configure
haben Sie OpenIddict so eingerichtet, dass JWT-Token bereitgestellt werden:Sie konfigurieren die Validierung von Token auch in
Configure
:Es gibt ein oder zwei weitere Kleinigkeiten, z. B. dass Ihr DbContext von OpenIddictContext abgeleitet werden muss.
In diesem Blogbeitrag finden Sie eine ausführliche Erklärung: http://capesean.co.za/blog/asp-net-5-jwt-tokens/
Eine funktionierende Demo finden Sie unter: https://github.com/capesean/openiddict-test
quelle