Authentification avec OpenID Connect
L’exemple suivant est extrait de l’exemple d’application C# .NET disponible ici :
Exemples / Projet d’application en C# .NET + JavaScript
Il utilise OpenID Connect qui étend le protocole d’autorisation OAuth 2.0 pour l’utiliser en tant que protocole d’authentification, ce qui vous permet de procéder à une authentification unique à l’aide d’OAuth.
Dans l’application le mécanisme d’authentification est implémenté en s’appuyant sur :
- un gestionnaire de cookie (permettant de stocker les informations de session de l’utilisateur)
- et un gestionnaire d’authentification OpenID Connect.
Ces gestionnaires sont référencés dans l’application par les packages :
Microsoft.AspNetCore.Authentication.Cookies
Microsoft.AspNetCore.Authentication.OpenIdConnect
Le code source de la partie authentification s’inspire de l’exemple disponible sur le site Auth0.
De cet exemple, le paramétrage a été adapté afin de spécifier les paramètres propres à l’authentification SageID dont l’API Sage Business Cloud Comptabilité à besoin pour autoriser l’exécution des différentes requêtes (bearer token passé en header de chaque appel http).
Comme pour le cas de l’authentification depuis Postman, les paramètres de connexion définis dans l’application sont les suivants :
- Url d’autorisation
- ClientId et Secret
- Url de redirection
- Scopes autorisés
- Audience
L’application permet également de déconnecter l’utilisateur de sa session SageID. Ainsi, une url de déconnexion est également définie.
Tous ces paramètres de connexion/déconnexion sont définis dans la méthode ConfigurationServices()
du fichier Startup.cs
:
- Url d’autorisation
const string AUTHORITY = "id-shadow.sage.com"; ... options.Authority = $"https://{AUTHORITY}";
- ClientId et Secret
options.ClientId = ApplicationSettings.client_id; options.ClientSecret = ApplicationSettings.client_secret;
- Url de redirection
if (!String.IsNullOrEmpty(ApplicationSettings.callback_url)) { var uri = new UriBuilder(ApplicationSettings.callback_url); options.CallbackPath = new PathString(uri.Path); }
Remarque : Les valeurs du ClientId, Secret et Url de redirection sont initialisées au chargement de l’application après lecture du fichier client_application.json (cf. méthode
InitializeApplicationSettings()
appelée au constructeur de Startup). - Scopes autorisés
options.Scope.Add("openid"); options.Scope.Add("offline_access"); options.Scope.Add("LDC"); options.Scope.Add("EDC"); ...
- Audience
const string AUDIENCE = "fr100saas/api.pub"; ... OnRedirectToIdentityProvider = (context) => { context.ProtocolMessage.SetParameter("audience", AUDIENCE); return Task.FromResult(0); }
- Url de déconnexion
OnRedirectToIdentityProviderForSignOut = (context) => { var logoutUri = $"https://{AUTHORITY}/v2/logout?client_id={options.ClientId}"; var postLogoutUri = context.Properties.RedirectUri; if (!string.IsNullOrEmpty(postLogoutUri)) { if (postLogoutUri.StartsWith("/")) { // transform to absolute var request = context.Request; postLogoutUri = request.Scheme + "://" + request.Host + request.PathBase + postLogoutUri; } logoutUri += $"&returnTo={ Uri.EscapeDataString(postLogoutUri)}"; } context.Response.Redirect(logoutUri); context.HandleResponse(); return Task.CompletedTask; },
Remarque : L’audience et l’url de déconnexion sont définies dans des évènements OpenIdConnect.
Ces évènements sont respectivement appelés par les méthodes de connexion et déconnexion au compte SageID. Ces méthodes sont définies dans le contrôleurAuthentificationController
- Connexion
public async Task Login() { if (!User.Identity.IsAuthenticated) { await HttpContext.ChallengeAsync("Auth0", new AuthenticationProperties() { RedirectUri = Url.Action("Index", "Home") }); } }
- Déconnexion
public async Task Logout() { await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme); await HttpContext.SignOutAsync("Auth0", new AuthenticationProperties()); }
A noter que dans le cas de la déconnexion, c’est un paramètre de la requête qui permet de rediriger la déconnexion vers la page home de l’application :
logoutUri += $"&returnTo={ Uri.EscapeDataString(postLogoutUri)}";