Intégrer Auth0.NET dans votre projet tout en suivant les conventions idiomatiques .NET peut être fastidieux et impliquer une quantité importante de passe-partout partagé entre les projets.
Cette bibliothèque espère résoudre ce problème, avec :
Extensions pour Microsoft.Extensions.DependencyInjection
.
Mise en cache et renouvellement automatiques des jetons d'accès pour l'API de gestion et vos propres services REST et Grpc
Intégration HttpClientFactory pour une extensibilité et une gestion centralisées des gestionnaires HTTP internes.
Extensions IHttpClientBuilder
, fournissant des gestionnaires pour ajouter automatiquement des jetons d'accès aux requêtes sortantes.
Cette bibliothèque est compatible avec tous les environnements d'exécution .NET Standard 2.0 (.NET 8+ recommandé) et convient pour une utilisation dans ASP.NET Core et les applications autonomes .NET Generic Host.
Ajoutez Auth0Net.DependencyInjection
à votre projet :
Install-Package Auth0Net.DependencyInjection
Si vous utilisez simplement AuthenticationApiClient
et rien d'autre, vous pouvez appeler AddAuth0AuthenticationClientCore
et transmettre votre domaine Auth0. Cette intégration est légère et ne prend en charge aucune autre fonctionnalité de cette bibliothèque.
services . AddAuth0AuthenticationClientCore ( "your-auth0-domain.auth0.com" ) ;
Vous pouvez ensuite demander le IAuthenticationApiClient
au sein de votre classe :
public class AuthController : ControllerBase
{
private readonly IAuthenticationApiClient _authenticationApiClient ;
public AuthController ( IAuthenticationApiClient authenticationApiClient )
{
_authenticationApiClient = authenticationApiClient ;
}
Ajoutez AuthenticationApiClient
avec AddAuth0AuthenticationClient
et fournissez une configuration d'application machine à machine qui sera consommée par les intégrations Management Client, Token Cache et IHttpClientBuilder. Cette extension doit être appelée avant d'utiliser toute autre extension de cette bibliothèque :
services . AddAuth0AuthenticationClient ( config =>
{
config . Domain = builder . Configuration [ "Auth0:Domain" ] ;
config . ClientId = builder . Configuration [ "Auth0:ClientId" ] ;
config . ClientSecret = builder . Configuration [ "Auth0:ClientSecret" ] ;
} ) ;
Ajoutez le ManagementApiClient
avec AddAuth0ManagementClient()
et ajoutez le DelegatingHandler
avec AddManagementAccessToken()
qui attachera automatiquement le jeton d'accès :
services . AddAuth0ManagementClient ( ) . AddManagementAccessToken ( ) ;
Assurez-vous que votre application Machine-to-Machine est autorisée à demander des jetons à l'API de gestion et qu'elle dispose des étendues appropriées pour les fonctionnalités que vous souhaitez utiliser.
Vous pouvez ensuite demander le IManagementApiClient
(ou IAuthenticationApiClient
) au sein de vos services :
public class MyAuth0Service : IAuth0Service
{
private readonly IManagementApiClient _managementApiClient ;
public MyAuth0Service ( IManagementApiClient managementApiClient )
{
_managementApiClient = managementApiClient ;
}
Si vous utilisez un domaine personnalisé avec votre locataire Auth0, vous pouvez rencontrer un problème en raison duquel l' audience
de l'API de gestion est mal définie. Vous pouvez remplacer cela via la propriété Audience
:
services . AddAuth0ManagementClient ( )
. AddManagementAccessToken ( c =>
{
c . Audience = "my-tenant.au.auth0.com" ;
} ) ;
Remarque : Cette fonctionnalité repose sur l'appel et la configuration services.AddAuth0AuthenticationClient(config => ...)
comme indiqué dans le scénario précédent.
Cette bibliothèque comprend un gestionnaire de délégation - en fait un middleware pour votre HttpClient - qui ajoutera un jeton d'accès à toutes les requêtes sortantes. Ceci est utile pour appeler d'autres services protégés par Auth0. Cette intégration nécessite que l'implémentation de votre service utilise IHttpClientFactory
dans le cadre de son enregistrement. Vous pouvez en savoir plus ici
Utilisez AddAccessToken
avec l'audience requise :
services . AddHttpClient < MyHttpService > ( x => x . BaseAddress = new Uri ( builder . Configuration [ "MyHttpService:Url" ] ) )
. AddAccessToken ( config => config . Audience = builder . Configuration [ "MyHttpService:Audience" ] ) ;
Cette extension est compatible avec tout enregistrement qui renvoie un IHttpClientBuilder
, elle peut donc être utilisée avec la fabrique client de Grpc :
services . AddGrpcClient < UserService . UserServiceClient > ( x => x . Address = new Uri ( builder . Configuration [ "MyGrpcService:Url" ] ) )
. AddAccessToken ( config => config . Audience = builder . Configuration [ "MyGrpcService:Audience" ] ) ;
AddAccessToken
dispose également d'une option permettant de transmettre une fonction qui peut résoudre l'audience au moment de l'exécution. Cela peut être utile si vos audiences attendues suivent toujours un modèle ou si vous vous appuyez sur la découverte de services, comme celle de Steeltoe.NET :
services . AddHttpClient < MyHttpService > ( x => x . BaseAddress = new Uri ( "https://MyServiceName/" ) )
. AddServiceDiscovery ( )
. AddAccessToken ( config => config . AudienceResolver = request => request . RequestUri . GetLeftPart ( UriPartial . Authority ) ) ;
Les clients d'authentification et d'autorisation sont enregistrés en tant que singletons et peuvent être injectés dans n'importe quelle autre vie.
Un exemple d’hôte générique .NET et d’ASP.NET Core est disponible dans le répertoire des exemples.
Auth0TokenCache
mettra en cache un jeton pour une audience donnée jusqu'à au moins 95 % du délai d'expiration. Si une requête au cache est effectuée entre 95 % et 99 % de l'expiration, le jeton sera actualisé en arrière-plan avant que l'expiration ne soit atteinte.
1 % supplémentaire de la durée de vie est supprimé pour protéger contre la dérive d'horloge entre les systèmes distribués.
Dans certaines situations, vous souhaiterez peut-être demander manuellement un jeton d'accès à Auth0. Vous pouvez y parvenir en injectant IAuth0TokenCache
dans une classe et en appelant GetTokenAsync
avec l'audience de l'API pour laquelle vous demandez le jeton.
Une instance en mémoire uniquement de FusionCache est utilisée comme implémentation de mise en cache. Cette instance est nommée et n'aura pas d'impact sur les autres utilisations de FusionCache.
Cette bibliothèque expose une simple extension de chaîne, ToHttpsUrl()
, qui peut être utilisée pour formater le domaine Auth0 nu situé dans votre configuration en une URL appropriée.
Ceci est identique à https://{Configuration["Auth0:Domain"]}/
que vous finissez généralement par écrire quelque part dans votre Startup.cs
.
Par exemple, formater le domaine pour l'autorité JWT :
. AddJwtBearer ( options =>
{
// "my-tenant.auth0.com" -> "https://my-tenant.auth0.com/"
options . Authority = builder . Configuration [ "Auth0:Domain" ] . ToHttpsUrl ( ) ;
//...
} ) ;
Je ne suis pas affilié ni ne représente Auth0. Tous les problèmes de mise en œuvre concernant les ManagementApiClient
et AuthenticationApiClient
sous-jacents doivent être adressés au référentiel Auth0.NET officiel.
Icônes utilisées sous la licence MIT du pack Identicons.