Übersicht über die ASP.NET Core-Authentifizierung
Von Mike Rousos
Als Authentifizierung wird der Vorgang bezeichnet, mit dem die Identität eines Benutzers festgestellt wird. Autorisierung ist der Vorgang, mit dem ermittelt wird, ob ein Benutzer Zugriff auf eine Ressource hat. In ASP.NET Core wird die Authentifizierung vom Authentifizierungsdienst behandelt, IAuthenticationServiceder von der Authentifizierungs-Middleware verwendet wird. Der Authentifizierungsdienst verwendet registrierte Authentifizierungshandler, um Aktionen im Zusammenhang mit der Authentifizierung auszuführen. Beispiele für Aktionen im Zusammenhang mit der Authentifizierung:
- Die Authentifizierung eines Benutzers.
- Reagieren auf den Versuch eines nicht authentifizierten Benutzers, auf eine eingeschränkte Ressource zuzugreifen.
Die registrierten Authentifizierungshandler und ihre Konfigurationsoptionen werden als „Schemas“ bezeichnet.
Authentifizierungsschemas werden festgelegt, indem die Authentifizierungsdienste bei Program.cs
registriert werden:
- Durch Aufrufen einer schemaspezifischen Erweiterungsmethode nach einem Aufruf von AddAuthentication, z AddJwtBearer . B. oder AddCookie. Diese Erweiterungsmethoden verwenden AuthenticationBuilder.AddScheme die Registrierung von Schemas mit entsprechenden Einstellungen.
- Weniger häufig, indem Sie direkt anrufen
AuthenticationBuilder.AddScheme
.
Im folgenden Code werden beispielsweise die Authentifizierungsdienste und -handler für cookie- und JWT-Bearer-Authentifizierungsschemas registriert:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme,
options => builder.Configuration.Bind("JwtSettings", options))
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme,
options => builder.Configuration.Bind("CookieSettings", options));
Der AddAuthentication
-Parameter JwtBearerDefaults.AuthenticationScheme ist der Name des Schemas, das standardmäßig verwendet werden soll, wenn kein bestimmtes Schema angefordert wird.
Wenn mehrere Schemas verwendet werden, können Autorisierungsrichtlinien (oder Autorisierungsattribute) das Authentifizierungsschema (oder die Authentifizierungsschemas) angeben, von denen sie zur Authentifizierung des Benutzers abhängig sind. Im Beispiel oben kann das cookieauthentifizierungsschema verwendet werden, indem der Name angegeben wird (standardmäßig CookieAuthenticationDefaults.AuthenticationScheme, obwohl beim Aufruf von AddCookie
ein anderer Name angegeben werden kann).
In bestimmten Fällen erfolgt der Aufruf von AddAuthentication
automatisch durch andere Erweiterungsmethoden. Wenn Sie z. B. ASP.NET Core Identity verwenden, wird AddAuthentication
intern aufgerufen.
Die Authentifizierungs-Middleware wird durch Aufrufen UseAuthenticationhinzugefügtProgram.cs
. Beim Aufrufen UseAuthentication
werden die Middleware registriert, die die zuvor registrierten Authentifizierungsschemas verwendet. Rufen Sie UseAuthentication
vor jeder Middleware auf, die voraussetzt, dass Benutzer authentifiziert sind.
Authentifizierungskonzepte
Die Authentifizierung ist verantwortlich für die Bereitstellung der ClaimsPrincipal-Klasse für die Autorisierung, um Berechtigungsentscheidungen zu treffen. Es gibt mehrere Ansätze zum Thema Authentifizierungsschema, um auszuwählen, welcher Authentifizierungshandler für die Erstellung der richtigen Ansprüche zuständig ist:
- Authentifizierungsschema
- Das Standardauthentifizierungsschema, das im nächsten Abschnitt erläutert wird
- Direktes Festlegen von HttpContext.User
Es gibt keine automatische Probung von Schemas. Wenn das Standardschema nicht angegeben wird, muss das Schema im autorisieren Attribut angegeben werden, andernfalls wird der folgende Fehler ausgelöst:
InvalidOperationException: No authenticationScheme was specified, and there was no DefaultAuthenticateScheme found. The default schemes can be set using either AddAuthentication(string defaultScheme) or AddAuthentication(Action<AuthenticationOptions> configureOptions) (Es wurde kein authenticationScheme angegeben, und DefaultAuthenticateScheme wurde nicht gefunden. Die Standardschemas können entweder mit AddAuthentication(Zeichenfolge defaultScheme) oder AddAuthentication(Aktion
configureOptions) festgelegt werden.)
Authentifizierungsschema
Das Authentifizierungsschema kann auswählen, welcher Authentifizierungshandler zum Generieren der richtigen Ansprüche verantwortlich ist. Weitere Informationen finden Sie unter Autorisieren mit einem bestimmten Schema.
Ein Authentifizierungsschema ist ein Name, der folgendes entspricht:
- Einem Authentifizierungshandler.
- Optionen zum Konfigurieren dieser bestimmten Instanz des Handlers.
Schemas sind als Mechanismus nützlich, um auf die Authentifizierungs-, Aufforderungs- und Unterbindungsverhalten des zugeordneten Handlers zu verweisen. Eine Autorisierungsrichtlinie kann beispielsweise anhand von Schemanamen angeben, welche Authentifizierungsschemas zum Authentifizieren des Benutzers verwendet werden sollen. Beim Konfigurieren der Authentifizierung ist es üblich, das Standardauthentifizierungsschema anzugeben. Das Standardschema wird verwendet, sofern eine Ressource kein bestimmtes Schema anfordert. Weitere Möglichkeiten:
- Angeben unterschiedlicher Standardschemas für Authentifizierungs-, Aufforderungs- und Unterbindungsaktionen.
- Kombinieren mehrerer Schemas mithilfe von Richtlinienschemas.
Authentifizierungshandler
Für einen Authentifizierungshandler gilt Folgendes:
- Es handelt sich um einen Typ, der das Verhalten eines Schemas implementiert.
- Er wird von IAuthenticationHandler oder AuthenticationHandler<TOptions> abgeleitet.
- Er trägt die Hauptverantwortung für die Authentifizierung von Benutzern.
In Abhängigkeit von der Konfiguration des Authentifizierungsschemas und vom Kontext der eingehenden Anforderung führen Authentifizierungshandler folgende Aktionen aus:
- Sie erstellen AuthenticationTicket-Objekte, die die Identität des Benutzers darstellen, wenn die Authentifizierung erfolgreich ist.
- Sie geben „kein Ergebnis“ oder „Fehler“ zurück, wenn die Authentifizierung nicht erfolgreich ist.
- Sie verfügen über Methoden für Aufforderungs- und Unterbindungsaktionen, wenn Benutzer versuchen, auf Ressourcen zuzugreifen:
- Sie sind nicht autorisierter Zugriff (verbieten).
- Wenn sie nicht authentifiziert sind (Herausforderung).
RemoteAuthenticationHandler<TOptions>
vs AuthenticationHandler<TOptions>
RemoteAuthenticationHandler<TOptions> ist die Klasse für eine Authentifizierung, bei der ein Remoteauthentifizierungsschritt erforderlich ist. Nachdem der Remoteauthentifizierungsschritt beendet wurde, ruft der Handler den vom Handler festgelegten CallbackPath
zurück. Der Handler beendet den Authentifizierungsschritt unter Verwendung der Informationen, die an den HandleRemoteAuthenticateAsync-Rückrufpfad übergeben werden. OAuth 2.0 und OIDC verwenden dieses Muster. JWT und cookiedies nicht, da sie die Bearer-Kopfzeile direkt verwenden und cookie authentifizieren können. In diesem Fall gilt für den remote gehostete Anbieter:
- Er ist der Authentifizierungsanbieter.
- Beispiele sind Facebook, Twitter, Google, Microsoft und alle anderen OIDC-Anbieter, die die Authentifizierung von Benutzern mithilfe des Handlermechanismus behandeln.
Authenticate
Die Authentifizierungsaktion eines Authentifizierungsschemas ist für das Erstellen der Identität des Benutzers basierend auf dem Anforderungskontext verantwortlich. Sie gibt ein AuthenticateResult, das angibt, ob die Authentifizierung erfolgreich war, und in diesem Fall außerdem die Identität des Benutzers in einem Authentifizierungsticket zurück. Siehe AuthenticateAsync. Beispiele für die Authentifizierung:
- Ein cookieauthentifizierungsschema, bei dem die Identität des Benutzers aus cookies erstellt wird.
- Ein JWT-Bearer-Schema, das ein JWT-Bearertoken zum Erstellen der Identität des Benutzers deserialisiert und überprüft.
Herausforderung
Eine Authentifizierungsaufforderung wird durch die Autorisierung aufgerufen, wenn ein nicht authentifizierter Benutzer einen Endpunkt anfordert, für den eine Authentifizierung erforderlich ist. Eine Authentifizierungsanforderung wird ausgestellt, z. B. wenn ein anonymer Benutzer eine eingeschränkte Ressource anfordert oder einem Anmeldelink folgt. Die Autorisierung ruft eine Aufforderung mithilfe des/der angegebenen Authentifizierungsschema(s) oder, wenn keines angegeben ist, des Standardschemas auf. Siehe ChallengeAsync. Beispiele für Authentifizierungsaufforderungen:
- Ein cookieauthentifizierungsschema, das den Benutzer auf eine Anmeldeseite umleitet.
- Ein JWT-Bearer-Schema, das ein 401-Ergebnis mit einem
www-authenticate: bearer
-Header zurückgibt.
Eine Aufforderungsaktion sollte dem Benutzer mitteilen können, welcher Authentifizierungsmechanismus für den Zugriff auf die angeforderte Ressource verwendet werden soll.
Unterbindung
Die authentifizierungsbasierte Aktion wird durch Autorisierung aufgerufen, wenn ein authentifizierter Benutzer versucht, auf eine Ressource zuzugreifen, auf die sie nicht zugreifen dürfen. Siehe ForbidAsync. Beispiele für Authentifizierungsunterbindungen:
- Ein cookieauthentifizierungsschema, das den Benutzer auf eine Seite umleitet, die anzeigt, dass der Zugriff unzulässig war.
- Ein JWT-Bearer-Schema, das ein 403-Ergebnis zurückgibt.
- Ein benutzerdefiniertes Authentifizierungsschema, das den Benutzer auf eine Seite umleitet, auf der er den Zugriff auf die Ressource anfordern kann.
Eine Unterbindungsaktion kann den Benutzer über Folgendes informieren:
- Sie werden authentifiziert.
- Sie dürfen nicht auf die angeforderte Ressource zugreifen.
Unter den folgenden Links finden Sie Informationen zu den Unterschieden zwischen Aufforderung und Unterbindung:
- Aufforderung und Unterbindung mit einem funktionsfähigen Ressourcenhandler
- Unterschiede zwischen Aufforderung und Unterbindung
Authentifizierungsanbieter pro Mandant
ASP.NET Core verfügt nicht über eine integrierte Lösung für die Mehrmandantenauthentifizierung. Während es für Kunden möglich ist, eine mit den integrierten Features zu schreiben, empfehlen wir Kunden, Das Obstgarten Core - oder ABP-Framework für die Mehrmandantenauthentifizierung zu berücksichtigen.
Orchard Core ist:
- Ein open-source-, modularer und multimandanter App-Framework, das mit ASP.NET Core erstellt wurde.
- ein Content Management System (CMS), das auf Grundlage dieses App-Frameworks erstellt wurde.
Im Quellcode von Orchard Core finden Sie ein Beispiel für Authentifizierungsanbieter pro Mandant.
ABP Framework unterstützt verschiedene Architekturmuster wie Modularität, Mikroservices, domänengesteuertes Design und Mandanten. Siehe ABP Framework-Quelle für GitHub.
Zusätzliche Ressourcen
Von Mike Rousos
Als Authentifizierung wird der Vorgang bezeichnet, mit dem die Identität eines Benutzers festgestellt wird. Autorisierung ist der Vorgang, mit dem ermittelt wird, ob ein Benutzer Zugriff auf eine Ressource hat. In ASP.NET Core wird die Authentifizierung vom Authentifizierungsdienst behandelt, IAuthenticationServiceder von Authentifizierungs-Middleware verwendet wird. Der Authentifizierungsdienst verwendet registrierte Authentifizierungshandler, um Aktionen im Zusammenhang mit der Authentifizierung auszuführen. Beispiele für Aktionen im Zusammenhang mit der Authentifizierung:
- Die Authentifizierung eines Benutzers.
- Reagieren auf den Versuch eines nicht authentifizierten Benutzers, auf eine eingeschränkte Ressource zuzugreifen.
Die registrierten Authentifizierungshandler und ihre Konfigurationsoptionen werden als „Schemas“ bezeichnet.
Authentifizierungsschemas werden festgelegt, indem die Authentifizierungsdienste bei Startup.ConfigureServices
registriert werden:
- Durch Aufrufen einer schemaspezifischen Erweiterungsmethode nach einem Aufruf von AddAuthentication (z. B. AddJwtBearer oder AddCookie). Diese Erweiterungsmethoden verwenden AuthenticationBuilder.AddScheme zum Registrieren von Schemas mit geeigneten Einstellungen.
- Weniger häufig, indem Sie direkt anrufen
AuthenticationBuilder.AddScheme
.
Im folgenden Code werden beispielsweise die Authentifizierungsdienste und -handler für cookie- und JWT-Bearer-Authentifizierungsschemas registriert:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme,
options => Configuration.Bind("JwtSettings", options))
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme,
options => Configuration.Bind("CookieSettings", options));
Der AddAuthentication
-Parameter JwtBearerDefaults.AuthenticationScheme ist der Name des Schemas, das standardmäßig verwendet werden soll, wenn kein bestimmtes Schema angefordert wird.
Wenn mehrere Schemas verwendet werden, können Autorisierungsrichtlinien (oder Autorisierungsattribute) das Authentifizierungsschema (oder die Authentifizierungsschemas) angeben, von denen sie zur Authentifizierung des Benutzers abhängig sind. Im Beispiel oben kann das cookieauthentifizierungsschema verwendet werden, indem der Name angegeben wird (standardmäßig CookieAuthenticationDefaults.AuthenticationScheme, obwohl beim Aufruf von AddCookie
ein anderer Name angegeben werden kann).
In bestimmten Fällen erfolgt der Aufruf von AddAuthentication
automatisch durch andere Erweiterungsmethoden. Wenn Sie z. B. ASP.NET Core Identity verwenden, wird AddAuthentication
intern aufgerufen.
Die Authentifizierungs-Middleware wird durch Aufrufen UseAuthenticationhinzugefügtStartup.Configure
. Beim Aufrufen UseAuthentication
wird die Middleware registriert, die die zuvor registrierten Authentifizierungsschemas verwendet. Rufen Sie UseAuthentication
vor jeder Middleware auf, die voraussetzt, dass Benutzer authentifiziert sind. Wenn Sie das Endpunktrouting verwenden, muss der Aufruf von UseAuthentication
:
- nach UseRouting stehen, damit die Routeninformationen für Authentifizierungsentscheidungen verfügbar sind.
- vor UseEndpoints stehen, damit Benutzer vor dem Zugriff auf die Endpunkte authentifiziert werden.
Authentifizierungskonzepte
Die Authentifizierung ist verantwortlich für die Bereitstellung der ClaimsPrincipal-Klasse für die Autorisierung, um Berechtigungsentscheidungen zu treffen. Es gibt mehrere Ansätze zum Thema Authentifizierungsschema, um auszuwählen, welcher Authentifizierungshandler für die Erstellung der richtigen Ansprüche zuständig ist:
- Authentifizierungsschema
- Das Standardauthentifizierungsschema, das im nächsten Abschnitt erläutert wird
- Direktes Festlegen von HttpContext.User
Es gibt keine automatische Untersuchung von Schemas. Wenn das Standardschema nicht angegeben ist, muss das Schema im Autorisieren-Attribut angegeben werden, andernfalls wird der folgende Fehler ausgelöst:
InvalidOperationException: No authenticationScheme was specified, and there was no DefaultAuthenticateScheme found. The default schemes can be set using either AddAuthentication(string defaultScheme) or AddAuthentication(Action<AuthenticationOptions> configureOptions) (Es wurde kein authenticationScheme angegeben, und DefaultAuthenticateScheme wurde nicht gefunden. Die Standardschemas können entweder mit AddAuthentication(Zeichenfolge defaultScheme) oder AddAuthentication(Aktion
configureOptions) festgelegt werden.)
Authentifizierungsschema
Das Authentifizierungsschema kann auswählen, welcher Authentifizierungshandler zum Generieren der richtigen Ansprüche verantwortlich ist. Weitere Informationen finden Sie unter Autorisieren mit einem bestimmten Schema.
Ein Authentifizierungsschema ist ein Name, der folgendes entspricht:
- Einem Authentifizierungshandler.
- Optionen zum Konfigurieren dieser bestimmten Instanz des Handlers.
Schemas sind als Mechanismus nützlich, um auf die Authentifizierungs-, Aufforderungs- und Unterbindungsverhalten des zugeordneten Handlers zu verweisen. Eine Autorisierungsrichtlinie kann beispielsweise anhand von Schemanamen angeben, welche Authentifizierungsschemas zum Authentifizieren des Benutzers verwendet werden sollen. Beim Konfigurieren der Authentifizierung ist es üblich, das Standardauthentifizierungsschema anzugeben. Das Standardschema wird verwendet, sofern eine Ressource kein bestimmtes Schema anfordert. Weitere Möglichkeiten:
- Angeben unterschiedlicher Standardschemas für Authentifizierungs-, Aufforderungs- und Unterbindungsaktionen.
- Kombinieren mehrerer Schemas mithilfe von Richtlinienschemas.
Authentifizierungshandler
Für einen Authentifizierungshandler gilt Folgendes:
- Es handelt sich um einen Typ, der das Verhalten eines Schemas implementiert.
- Er wird von IAuthenticationHandler oder AuthenticationHandler<TOptions> abgeleitet.
- Er trägt die Hauptverantwortung für die Authentifizierung von Benutzern.
In Abhängigkeit von der Konfiguration des Authentifizierungsschemas und vom Kontext der eingehenden Anforderung führen Authentifizierungshandler folgende Aktionen aus:
- Sie erstellen AuthenticationTicket-Objekte, die die Identität des Benutzers darstellen, wenn die Authentifizierung erfolgreich ist.
- Sie geben „kein Ergebnis“ oder „Fehler“ zurück, wenn die Authentifizierung nicht erfolgreich ist.
- Sie verfügen über Methoden für Aufforderungs- und Unterbindungsaktionen, wenn Benutzer versuchen, auf Ressourcen zuzugreifen:
- Sie sind nicht autorisierter Zugriff (verbietet).
- Wenn sie nicht authentifiziert sind (Herausforderung).
RemoteAuthenticationHandler<TOptions>
vs AuthenticationHandler<TOptions>
RemoteAuthenticationHandler<TOptions> ist die Klasse für eine Authentifizierung, bei der ein Remoteauthentifizierungsschritt erforderlich ist. Nachdem der Remoteauthentifizierungsschritt beendet wurde, ruft der Handler den vom Handler festgelegten CallbackPath
zurück. Der Handler beendet den Authentifizierungsschritt unter Verwendung der Informationen, die an den HandleRemoteAuthenticateAsync-Rückrufpfad übergeben werden. OAuth 2.0 und OIDC verwenden dieses Muster. JWT und cookienicht, da sie den Bearerheader direkt verwenden und cookie authentifizieren können. In diesem Fall gilt für den remote gehostete Anbieter:
- Er ist der Authentifizierungsanbieter.
- Beispiele sind Facebook, Twitter, Google, Microsoft und alle anderen OIDC-Anbieter, die benutzer mithilfe des Handlermechanismus authentifizieren.
Authenticate
Die Authentifizierungsaktion eines Authentifizierungsschemas ist für das Erstellen der Identität des Benutzers basierend auf dem Anforderungskontext verantwortlich. Sie gibt ein AuthenticateResult, das angibt, ob die Authentifizierung erfolgreich war, und in diesem Fall außerdem die Identität des Benutzers in einem Authentifizierungsticket zurück. Siehe AuthenticateAsync. Beispiele für die Authentifizierung:
- Ein cookieauthentifizierungsschema, bei dem die Identität des Benutzers aus cookies erstellt wird.
- Ein JWT-Bearer-Schema, das ein JWT-Bearertoken zum Erstellen der Identität des Benutzers deserialisiert und überprüft.
Herausforderung
Eine Authentifizierungsaufforderung wird durch die Autorisierung aufgerufen, wenn ein nicht authentifizierter Benutzer einen Endpunkt anfordert, für den eine Authentifizierung erforderlich ist. Eine Authentifizierungsanforderung wird ausgestellt, z. B. wenn ein anonymer Benutzer eine eingeschränkte Ressource anfordert oder einem Anmeldelink folgt. Die Autorisierung ruft eine Aufforderung mithilfe des/der angegebenen Authentifizierungsschema(s) oder, wenn keines angegeben ist, des Standardschemas auf. Siehe ChallengeAsync. Beispiele für Authentifizierungsaufforderungen:
- Ein cookieauthentifizierungsschema, das den Benutzer auf eine Anmeldeseite umleitet.
- Ein JWT-Bearer-Schema, das ein 401-Ergebnis mit einem
www-authenticate: bearer
-Header zurückgibt.
Eine Aufforderungsaktion sollte dem Benutzer mitteilen können, welcher Authentifizierungsmechanismus für den Zugriff auf die angeforderte Ressource verwendet werden soll.
Unterbindung
Die Authentifizierungsaktion eines Authentifizierungsschemas wird durch Autorisierung aufgerufen, wenn ein authentifizierter Benutzer versucht, auf eine Ressource zuzugreifen, auf die er nicht zugreifen darf. Siehe ForbidAsync. Beispiele für Authentifizierungsunterbindungen:
- Ein cookieauthentifizierungsschema, das den Benutzer auf eine Seite umleitet, die anzeigt, dass der Zugriff unzulässig war.
- Ein JWT-Bearer-Schema, das ein 403-Ergebnis zurückgibt.
- Ein benutzerdefiniertes Authentifizierungsschema, das den Benutzer auf eine Seite umleitet, auf der er den Zugriff auf die Ressource anfordern kann.
Eine Unterbindungsaktion kann den Benutzer über Folgendes informieren:
- Sie werden authentifiziert.
- Sie dürfen nicht auf die angeforderte Ressource zugreifen.
Unter den folgenden Links finden Sie Informationen zu den Unterschieden zwischen Aufforderung und Unterbindung:
- Aufforderung und Unterbindung mit einem funktionsfähigen Ressourcenhandler
- Unterschiede zwischen Aufforderung und Unterbindung
Authentifizierungsanbieter pro Mandant
ASP.NET Core Framework verfügt nicht über eine integrierte Lösung für die Mehrmandantenauthentifizierung. Während es für Kunden möglich ist, eine App mit multimandanter Authentifizierung zu schreiben, empfehlen wir die Verwendung eines der folgenden asp.net Kernanwendungsframeworks, die mehrmandantenauthentifizierung unterstützen:
Obstgartenkern
Obstgarten Core. Im Quellcode von Orchard Core finden Sie ein Beispiel für Authentifizierungsanbieter pro Mandant.
ABP Framework
ABP Framework unterstützt verschiedene architekturbezogene Muster wie Modularität, Mikroservices, domänengesteuertes Design und mehrstufige Mandanten. Siehe ABP Framework-Quelle auf GitHub.