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 :

Ces gestionnaires sont référencés dans l’application par les packages :

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 :

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 :

  1. Url d’autorisation
    const string AUTHORITY = "id-shadow.sage.com";
    ...
    options.Authority = $"https://{AUTHORITY}";
    
  2. ClientId et Secret
     options.ClientId = ApplicationSettings.client_id;
     options.ClientSecret = ApplicationSettings.client_secret;
    
  3. 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).

  4. Scopes autorisés
     options.Scope.Add("openid");
     options.Scope.Add("offline_access");
     options.Scope.Add("LDC");
     options.Scope.Add("EDC");
     ...
    
  5. Audience
     const string AUDIENCE = "fr100saas/api.pub";
     ...
     OnRedirectToIdentityProvider = (context) =>
     {
         context.ProtocolMessage.SetParameter("audience", AUDIENCE);
    
         return Task.FromResult(0);
     }
    
    
  6. 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ôleur AuthentificationController

  7. Connexion
    public async Task Login()
    {
        if (!User.Identity.IsAuthenticated)
        {
            await HttpContext.ChallengeAsync("Auth0", new AuthenticationProperties() { RedirectUri = Url.Action("Index", "Home") });
        }
    }
    
  8. 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)}";