Heim >Backend-Entwicklung >C#.Net-Tutorial >Analyse des .NET Core-Zertifizierungsmanagements

Analyse des .NET Core-Zertifizierungsmanagements

PHPz
PHPzOriginal
2017-03-12 16:36:031559Durchsuche

Authentifizierungsverwaltungsanalyse in .NET Core

0x00 Ursache des Problems

Beim Erstellen eines neuen .NET Core-Webs Projekt Wählen Sie „Persönliches Benutzerkonto verwenden“, um ein Projekt mit Benutzern zu erstellen und Berechtigungsverwaltung. Viele Seiten wie Benutzerregistrierung und Login stehen Ihnen auch zur Verfügung, um verschiedene Aufgaben auszuführen . Diese Art der Berechtigungsverwaltung scheint sehr praktisch zu sein. Aber ich weiß nicht, was der generierte Code für mich tut. Nach einem Blick auf die generierte Datentabelle sind die Funktionen recht kompliziert. Tatsächlich benötige ich lediglich eine Authentifizierungsverwaltung basierend auf Benutzern und Rollen, und Benutzerinformationen nutzen vorhandene Bibliotheken. Die Verwendung der mit .NET Core gelieferten Authentifizierungskomponente muss jedoch auf EF basieren, und viele Tabellenstrukturen stimmen nicht überein Ich muss lernen, dass ich die integrierte Authentifizierungskomponente implementiert und dann meinen eigenen Authentifizierungs--Dienst geschrieben habe, um die Identitätskomponente zu ersetzen. Gleichzeitig wurde Cookie mithilfe der integrierten Authentifizierungskomponente verwaltet Cookie Middleware , Sie können AuthorizeAttribute zur Authentifizierung verwenden. Ich bin noch nicht auf komplexe Anforderungen gestoßen und habe es daher erst hier erfahren. In diesem Blog geht es im einfachsten Fall um die benutzer- und rollenbasierte Authentifizierung. Informationen zur grundlegenden Verwendung der integrierten Authentifizierungskomponenten von .NET Core finden Sie unter http://www.php.cn/.

0x01 Authentifizierungsverwaltung in .NET Core

Wenn es um Authentifizierungsverwaltung geht, denkt der Premierminister an Benutzerregistrierung, Anmeldung, Abmeldung und Hinzufügen/ Entfernen Sie Funktionen wie -Zeichen. Benutzerinformationen, Rolleninformationen usw. werden alle in der Datenbank gespeichert. Es umfasst also hauptsächlich zwei Teile: Datenbankbetrieb und Anmeldegeschäftslogik. Auf der Ebene der Anmeldegeschäftslogik wird .NET Core hauptsächlich über die drei Kernklassen UserManager, RoleManager und SigninManager (in der Microsoft.AspNetCore.Identity-Assembly) verwaltet. Darunter:

  • UserManager ist hauptsächlich für die Benutzerauthentifizierung, Registrierung, Änderung, Löschung und Verwaltung benutzerbezogener Rollen, Token, Anweisungen usw. verantwortlich.

  • RoleManager ist für die Verwaltung von Rollen und rollenbezogenen Anweisungen verantwortlich.

  • SigninManager ist für die Anmeldung, Abmeldung und andere damit verbundene Vorgänge verantwortlich. Wenn Benutzervorgänge beteiligt sind (z. B. Benutzerüberprüfung während der Anmeldung), wird UserManager aufgerufen, um Vorgänge auszuführen.

Beim Betrieb der Datenbank verwenden diese drei Kernklassen UserStore und RoleStore auf Datenbankebene (in der Microsoft.AspNetCore.Identity.EntityFrameworkCore-Assembly). Die Geschäftsbeziehung ist in der folgenden Abbildung dargestellt:

Wir können diese drei Kernklassen bei der Entwicklung authentifizierungsbezogener Funktionen verwenden . Die meisten Bedürfnisse. Wenn wir die Objekte dieser Kernklassen verwenden, werden sie durch Abhängigkeitsinjektion erhalten. Wann werden diese zugehörigen Abhängigkeiten injiziert? In der Startup-Methode „ConfigureServices“ gibt es eine AddIdentity-Erweiterungsmethode, in der alle erforderlichen Abhängigkeiten hinzugefügt werden.

0x02 Anmelden und Abmelden

Nachdem wir die allgemeine Arbeitsteilung der Identitätskomponente verstanden haben, wollen wir Sehen Sie sich die Anmelde- und Teildetails des Abmeldevorgangs an. SigninManager ist hauptsächlich für den Anmelde- und Abmeldevorgang verantwortlich. Schauen wir uns zunächst den Anmeldevorgang an:

Antwort danach erfolgreicher Login Header enthält Set-Cookie Der Key des Cookies muss mit dem in der Cookie-Middleware gesetzten Key des zu entschlüsselnden Cookies übereinstimmen . Dies wird im Screenshot gezeigt. Der Schlüssel von Cookie ist IdentityCookie. Setzen Sie das Cookie und senden Sie eine 302-Weiterleitung zur Anmeldeseite zurück.

Bei der Weiterleitung zur Anmeldeseite enthält die Anfrage bereits ein Cookie, dessen Schlüssel auf IdentityCookie gesetzt ist.

Der Abmeldevorgang ist relativ einfach. Rufen Sie HttpContext.Authentication auf .SignOutAsync-Methode zum Abmelden. Zu diesem Zeitpunkt wird Set-Cookie zu HttpContext.Response hinzugefügt, der Inhalt ist jedoch leer.

0x03 Identifizieren Sie den Benutzer durch Cookie

In .NET Core durch CookieAuthenticationMiddleware ist eine Middleware, die authentifizierungsbezogene Cookies in HttpContext identifiziert und dadurch die Authentifizierungs- und Autorisierungsinformationen des Benutzers hinzufügt. Das Wichtigste ist das ClaimsPrincipal-Objekt, das die Authentifizierungs- und Autorisierungsinformationen des Benutzers aufzeichnet (darüber hinaus kann es natürlich auch andere alle benötigten Informationen enthalten). oben, nachdem sich der Benutzer erfolgreich angemeldet hat, werden die Authentifizierungs- und Autorisierungsinformationen im ClaimsPrincipal-Objekt gespeichert (tatsächlich werden die Authentifizierungsinformationen in diesem Cookie-Schlüssel-Wert-Paar als ClaimsIdentity gespeichert, und ein ClaimsPrincipal kann mehrere ClaimsIdentity enthalten) und dann hinzufügen Set -Cookie zu den Headern von HttpContext.Response, mit dem Schlüssel. Der in der Cookie-Middleware angegebene CookieName und Value sind die verschlüsselte Zeichenfolge dieses Objekts. In Zukunft wird HttpContext über dieses Cookie verfügen. Die Cookie-Middleware entfernt das Cookie, das diesem CookieName entspricht, entschlüsselt es, stellt es im ClaimsPrincipal-Objekt wieder her und setzt HttpContext.User auf dieses Objekt. Später, wenn die MVC-Middleware Routing an den entsprechenden Controller und die Aktion durchführt, kann sie HttpContext.User basierend auf der in der Autorisierung angegebenen Authentifizierung und Rolle einchecken Wenn die Prüfung nicht erfüllt ist, springen Sie zur entsprechenden Seite. Daher ist zu beachten, dass die Cookie-Middleware vor der MVC-Middleware platziert werden muss.

Eine besondere Erwähnung verdient hier ClaimsPrincipal. Ein ClaimsPrincipal-Objekt enthält ein oder mehrere ClaimsIdentity-Objekte. Ein ClaimsIdentity-Objekt entspricht im Allgemeinen einem bestimmten Schlüssel-Wert-Paar in einem Cookie (persönliches Verständnis). Cookie-Middleware und ClaimsIdentity sind über AuthenticationScheme verbunden. Wenn wir später unseren eigenen Authentifizierungsdienst schreiben, machen wir auch das AuthenticationScheme der Cookie-Middleware mit der erstellten ClaimsIdentity konsistent. Daher ist es genauer zu sagen, dass ClaimsIdentity Ansprüche für Benutzerauthentifizierung und Berechtigungen enthält, während ClaimsPrincipal mehrere ClaimsIdentity enthalten kann. Wenn sich mehrere Cookie-Middlewares in der Pipeline befinden, werden sie durch AuthenticationScheme unterschieden.

Zusätzlich zu AuthenticationScheme gibt es zwei weitere wichtige Attribute in ClaimsIdentity, UserType und RoleType, wobei UserType den Benutzerauthentifizierungstyp und RoleType den Rollenüberprüfungstyp angibt . Das heißt, wenn ich den RoleType als „RoleName“ spezifiziere, dann suche ich bei der Rollenauthentifizierung nach allen Werten vom Typ „RoleName“ in Claims und prüfe, ob sie den in Authorize angegebenen RoleName enthalten. .NET Core verfügt jedoch über ClaimTypes und kann direkt verwendet werden. Der Rollentyp ist beispielsweise ClaimTypes.Role. Wenn Sie beim Hinzufügen einer Rolle die integrierte ClaimTypes.Role verwenden, müssen Sie den RoleType beim Erstellen von ClaimsIdentity nicht explizit angeben. Die Standardrollenauthentifizierung verwendet ClaimTypes.Role.

Das Hinzufügen von Cookie-Middleware wird über die Erweiterungsmethode app.UseIdentity in der Methode „Configure“ im Startup implementiert. Diese Erweiterungsmethode fügt tatsächlich eine Vielzahl von Cookie-Identifizierungsmethoden hinzu. Ich werde nur eines verwenden, wenn ich später meine eigene Benutzerauthentifizierungsverwaltung schreibe.

0x04 Schreiben Sie Ihr eigenes Benutzerauthentifizierungsmanagement

Nachdem wir den Benutzerauthentifizierungsprozess verstanden haben, können wir unser eigenes Authentifizierungsmanagement schreiben, um die Identitätskomponente zu ersetzen, die ebenfalls in Datenbankoperationen und Authentifizierungsgeschäftslogik unterteilt ist . Ich werde nicht viel über die Datenbank sagen. Sie ist alles in der IdentityRepository-Klasse geschrieben, die nur sehr einfache Datenoperationen hat. Der Einfachheit halber wird Dapper verwendet und die Datenbank ist Sqlite. Das Programm überprüft beim Start die Datenbanktabelle. Ist dies nicht der Fall, erstellt es automatisch eine leere Tabelle.

Der Authentifizierungsdienst ist auch relativ einfach in der IdentityService-Klasse geschrieben, die Registrierungs- und Anmeldevorgänge bereitstellt. Das Abmelden ist zu einfach. Der Einfachheit halber wird keine Rollenverwaltungsseite bereitgestellt. Wenn Sie die Rollenauthentifizierungsfunktion testen möchten, müssen Sie Role manuell zur Datenbank hinzufügen und dann Role zum Benutzer in UserRoles hinzufügen.

Anmelden:

Registrieren:

Abmelden:

Nur ​​zum Testen gibt es viele logische Probleme, wie z. B. die Klartextspeicherung von Benutzerpasswörter. Konzentrieren Sie sich auf den Prozess:)

0x05 Schreiben Sie es am Ende

Dies ist das erste Mal, dass ich mit dem Web in Kontakt komme Anwendungen, und viele Konzepte sind mir unbekannt. Sehr verständnisvoll. Nehmen wir als Beispiel Benutzer der Cookie-Authentifizierung. Ich wusste bisher nur, wie man Benutzer mithilfe von Cookies identifiziert. Ich dachte immer, dass ich nach Erhalt von Cookies die entsprechenden Berechtigungsinformationen aus der Datenbank oder dem Cache finden würde. Nachdem ich jedoch den integrierten Cookie-Middleware-Code gelesen hatte, wurde mir klar, dass die Authentifizierungsinformationen direkt im Cookie gespeichert sind und daher nur entschlüsselt und deserialisiert werden müssen. Die Identity-Assembly umfasst viele andere Assemblys (Sicherheit, HttpAbstraction usw.), was mir schließlich schwindelig wurde, aber ich habe mich nicht mit vielen Details befasst, die auf Code basieren , und einige basieren auf persönlichem Verständnis. Ich hoffe, dass jeder barmherzig ist, wenn es Fehler gibt.

Das obige ist der detaillierte Inhalt vonAnalyse des .NET Core-Zertifizierungsmanagements. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn