Die Integration von Auth0.NET in Ihr Projekt unter Einhaltung idiomatischer .NET-Konventionen kann umständlich sein und eine beträchtliche Menge an Boilerplates erfordern, die von Projekten gemeinsam genutzt werden.
Diese Bibliothek hofft, dieses Problem zu lösen, indem sie Folgendes umfasst:
Erweiterungen für Microsoft.Extensions.DependencyInjection
.
Automatisches Zwischenspeichern und Erneuern von Zugriffstoken für die Management-API und Ihre eigenen REST- und Grpc-Dienste
HttpClientFactory-Integration für zentrale Erweiterbarkeit und Verwaltung der internen HTTP-Handler.
IHttpClientBuilder
Erweiterungen, die Handler zum automatischen Anhängen von Zugriffstoken an ausgehende Anforderungen bereitstellen.
Diese Bibliothek ist mit allen .NET Standard 2.0-Laufzeiten kompatibel (.NET 8+ empfohlen) und eignet sich für die Verwendung in ASP.NET Core und eigenständigen .NET Generic Host-Anwendungen.
Fügen Sie Auth0Net.DependencyInjection
zu Ihrem Projekt hinzu:
Install-Package Auth0Net.DependencyInjection
Wenn Sie lediglich AuthenticationApiClient
und nichts anderes verwenden, können Sie AddAuth0AuthenticationClientCore
aufrufen und Ihre Auth0-Domäne übergeben. Diese Integration ist leichtgewichtig und unterstützt keine anderen Funktionen dieser Bibliothek.
services . AddAuth0AuthenticationClientCore ( "your-auth0-domain.auth0.com" ) ;
Anschließend können Sie den IAuthenticationApiClient
innerhalb Ihrer Klasse anfordern:
public class AuthController : ControllerBase
{
private readonly IAuthenticationApiClient _authenticationApiClient ;
public AuthController ( IAuthenticationApiClient authenticationApiClient )
{
_authenticationApiClient = authenticationApiClient ;
}
Fügen Sie AuthenticationApiClient
mit AddAuth0AuthenticationClient
hinzu und stellen Sie eine Maschine-zu-Maschine-Anwendungskonfiguration bereit, die von den Integrationen Management Client, Token Cache und IHttpClientBuilder genutzt wird. Diese Erweiterung muss aufgerufen werden, bevor andere Erweiterungen in dieser Bibliothek verwendet werden:
services . AddAuth0AuthenticationClient ( config =>
{
config . Domain = builder . Configuration [ "Auth0:Domain" ] ;
config . ClientId = builder . Configuration [ "Auth0:ClientId" ] ;
config . ClientSecret = builder . Configuration [ "Auth0:ClientSecret" ] ;
} ) ;
Fügen Sie den ManagementApiClient
mit AddAuth0ManagementClient()
hinzu und fügen Sie den DelegatingHandler
mit AddManagementAccessToken()
hinzu, der das Zugriffstoken automatisch anfügt:
services . AddAuth0ManagementClient ( ) . AddManagementAccessToken ( ) ;
Stellen Sie sicher, dass Ihre Machine-to-Machine-Anwendung berechtigt ist, Token von der Verwaltungs-API anzufordern, und dass sie über die richtigen Bereiche für die Funktionen verfügt, die Sie verwenden möchten.
Anschließend können Sie den IManagementApiClient
(oder IAuthenticationApiClient
) innerhalb Ihrer Dienste anfordern:
public class MyAuth0Service : IAuth0Service
{
private readonly IManagementApiClient _managementApiClient ;
public MyAuth0Service ( IManagementApiClient managementApiClient )
{
_managementApiClient = managementApiClient ;
}
Wenn Sie eine benutzerdefinierte Domäne mit Ihrem Auth0-Mandanten verwenden, kann es zu einem Problem kommen, bei dem die audience
der Verwaltungs-API falsch festgelegt wird. Sie können dies über die Audience
-Eigenschaft überschreiben:
services . AddAuth0ManagementClient ( )
. AddManagementAccessToken ( c =>
{
c . Audience = "my-tenant.au.auth0.com" ;
} ) ;
Hinweis: Diese Funktion setzt voraus, dass services.AddAuth0AuthenticationClient(config => ...)
wie im vorherigen Szenario beschrieben aufgerufen und konfiguriert wird.
Diese Bibliothek enthält einen delegierenden Handler – praktisch Middleware für Ihren HttpClient – der allen ausgehenden Anforderungen ein Zugriffstoken anhängt. Dies ist nützlich, um andere Dienste aufzurufen, die durch Auth0 geschützt sind. Diese Integration erfordert, dass Ihre Dienstimplementierung IHttpClientFactory
als Teil ihrer Registrierung verwendet. Mehr darüber können Sie hier lesen
Verwenden Sie AddAccessToken
zusammen mit der erforderlichen Zielgruppe:
services . AddHttpClient < MyHttpService > ( x => x . BaseAddress = new Uri ( builder . Configuration [ "MyHttpService:Url" ] ) )
. AddAccessToken ( config => config . Audience = builder . Configuration [ "MyHttpService:Audience" ] ) ;
Diese Erweiterung ist mit jeder Registrierung kompatibel, die einen IHttpClientBuilder
zurückgibt, und kann daher mit der Client-Factory von Grpc verwendet werden:
services . AddGrpcClient < UserService . UserServiceClient > ( x => x . Address = new Uri ( builder . Configuration [ "MyGrpcService:Url" ] ) )
. AddAccessToken ( config => config . Audience = builder . Configuration [ "MyGrpcService:Audience" ] ) ;
AddAccessToken
verfügt außerdem über eine Option zum Übergeben einer Funktion, die die Zielgruppe zur Laufzeit auflösen kann. Dies kann nützlich sein, wenn Ihre erwarteten Zielgruppen immer einem Muster folgen oder wenn Sie sich auf die Serviceerkennung verlassen, beispielsweise von Steeltoe.NET:
services . AddHttpClient < MyHttpService > ( x => x . BaseAddress = new Uri ( "https://MyServiceName/" ) )
. AddServiceDiscovery ( )
. AddAccessToken ( config => config . AudienceResolver = request => request . RequestUri . GetLeftPart ( UriPartial . Authority ) ) ;
Sowohl die Authentifizierungs- als auch die Autorisierungsclients werden als Singletons registriert und können in jede andere Lebensdauer eingefügt werden.
Im Beispielverzeichnis sind sowohl ein .NET Generic Host als auch ein ASP.NET Core-Beispiel verfügbar.
Der Auth0TokenCache
speichert ein Token für eine bestimmte Zielgruppe bis mindestens 95 % der Ablaufzeit zwischen. Wenn zwischen 95 % und 99 % des Ablaufdatums eine Anfrage an den Cache gestellt wird, wird das Token im Hintergrund aktualisiert, bevor das Ablaufdatum erreicht ist.
Zum Schutz vor Taktdrift zwischen verteilten Systemen wird zusätzlich 1 % der Lebensdauer entfernt.
In manchen Situationen möchten Sie möglicherweise manuell ein Zugriffstoken von Auth0 anfordern. Sie können dies erreichen, indem Sie IAuth0TokenCache
in eine Klasse einfügen und GetTokenAsync
mit der Zielgruppe der API aufrufen, für die Sie das Token anfordern.
Als Caching-Implementierung wird eine reine In-Memory-Instanz von FusionCache verwendet. Diese Instanz ist benannt und hat keinen Einfluss auf andere Verwendungen von FusionCache.
Diese Bibliothek stellt eine einfache String-Erweiterung bereit, ToHttpsUrl()
, die verwendet werden kann, um die nackte Auth0-Domäne in Ihrer Konfiguration in eine richtige URL zu formatieren.
Dies ist identisch mit https://{Configuration["Auth0:Domain"]}/
das Sie normalerweise irgendwo in Ihre Startup.cs
schreiben.
Formatieren Sie beispielsweise die Domäne für die JWT-Autorität:
. AddJwtBearer ( options =>
{
// "my-tenant.auth0.com" -> "https://my-tenant.auth0.com/"
options . Authority = builder . Configuration [ "Auth0:Domain" ] . ToHttpsUrl ( ) ;
//...
} ) ;
Ich bin weder mit Auth0 verbunden noch vertrete ich es. Alle Implementierungsprobleme bezüglich des zugrunde liegenden ManagementApiClient
und AuthenticationApiClient
sollten an das offizielle Auth0.NET-Repository gerichtet werden.
Symbole, die unter der MIT-Lizenz aus dem Identicons-Paket verwendet werden.