Mise en œuvre d’ASP.NET Core (Web Apps + SSO)

Le code source complet de l’implémentation ASP.NET Core se trouve dans ce répertoire GitHub.

Configurer le témoin et le logiciel médiateur OIDC

Pour les besoins de ce guide, nous utiliserons une simple connexion hébergée. Vous pouvez utiliser le témoin standard et le logiciel médiateur OIDC qui est disponible avec ASP.NET Core, assurez-vous donc d’installer les paquets NuGet.

Install-Package Microsoft.AspNetCore.Authentication.Cookies
Install-Package Microsoft.AspNetCore.Authentication.OpenIdConnect

Was this helpful?

/

Configurez ensuite le logiciel médiateur OIDC et le témoin dans le pipeline du logiciel médiateur de votre application.

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        // Add authentication services
        services.AddAuthentication(
            options => options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme);

        // Code omitted for brevity...
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IOptions<Auth0Settings> auth0Settings)
    {
        // Code omitted for brevity...

        // Add the cookie middleware
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AutomaticAuthenticate = true,
            AutomaticChallenge = true
        });

        // Add the OIDC middleware
        app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions("Auth0")
        {
            // Set the authority to your Auth0 domain
            Authority = "https://{yourDomain}/",

            // Configure the Auth0 Client ID and Client Secret
            ClientId = {yourClientId},
            ClientSecret = YOUR_CLIENT_SECRET,

            // Do not automatically authenticate and challenge
            AutomaticAuthenticate = false,
            AutomaticChallenge = false,

            // Set response type to code
            ResponseType = "code",

            CallbackPath = new PathString("/signin-auth0"),

            // Configure the Claims Issuer to be Auth0
            ClaimsIssuer = "Auth0"
        });

        // Code omitted for brevity...
    }
}

Was this helpful?

/

Comme vous pouvez le voir dans le code ci-dessus, nous avons configuré deux types différents du logiciel médiateur d’authentification.

Le premier est le logiciel médiateur de gestion des témoin qui a été enregistré avec l’appel à UseCookieAuthentication. Le second est le logiciel médiateur OIDC qui a été enregistré avec l’appel à UseOpenIdConnectAuthentication.

Une fois que l’utilisateur s’est connecté à Auth0 à l’aide du logiciel médiateur OIDC, ses informations sont automatiquement stockées dans un témoin de session. Il suffit de configurer le logiciel médiateur comme indiqué ci-dessus pour qu’il s’occupe de la gestion de la session de l’utilisateur.

Le logiciel médiateur OpenID Connect (OIDC) extraira également toutes les demandes du jeton d’ID, qui est envoyé par Auth0 une fois que l’utilisateur s’est authentifié, et les ajoutera en tant que demandes sur le ClaimsIdentity.

Mise en œuvre de la déconnexion

Vous pouvez contrôler à la fois la session de l’application et la session Auth0 en utilisant la méthode SignOutAsync de la classe AuthenticationManager, et en transmettant le schéma d’authentification à partir duquel vous souhaitez vous déconnecter.

Par exemple, pour se déconnecter du logiciel médiateur de gestion des témoins, et ainsi effacer le témoin d’authentification de votre application, vous pouvez effectuer l’appel suivant :

await HttpContext.Authentication.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);

Was this helpful?

/

De même, vous pouvez déconnecter l’utilisateur d'Auth0 en appelant la méthode SignOutAsync et en transmettant Auth0 comme schéma d’authentification à déconnecter.

await HttpContext.Authentication.SignOutAsync("Auth0");

Was this helpful?

/

Pour que cela fonctionne, vous devrez cependant ajouter une configuration supplémentaire lors de l’enregistrement du logiciel médiateur OIDC en gérant l’événement OnRedirectToIdentityProviderForSignOut. Dans cet événement, vous devrez rediriger vers le point de terminaison de déconnexion Auth0, ce qui effacera le témoin Auth0.

app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions("Auth0")
{
    // Some code omitted for brevity
    Events = new OpenIdConnectEvents
    {
        OnRedirectToIdentityProviderForSignOut = context =>
        {
            context.Response.Redirect($"https://{auth0Settings.Value.Domain}/v2/logout?client_id={auth0Settings.Value.ClientId}&returnTo={context.Request.Scheme}://{context.Request.Host}/");
            context.HandleResponse();

            return Task.FromResult(0);
        }
    }
});

Was this helpful?

/

Vous devrez également vous assurer que vous ajoutez l’URL de votre application à URL de déconnexion autorisées de votre application dans le tableau de bord Auth0. Pour plus d’informations, reportez-vous à Déconnexion.

Mettre en oeuvre les permissions d’administration

La manière la plus simple d’intégrer les groupes dans une application ASP.NET Core est d’utiliser l’autorisation intégrée Autorisation basée sur les rôles disponible dans ASP.NET Core. Pour ce faire, nous devrons ajouter une Demande de type

http://schemas.microsoft.com/ws/2008/06/identity/claims/role

Was this helpful?

/

pour chacun des groupes auxquels un utilisateur est assigné.

Une fois les demandes ajoutées, nous pouvons facilement nous assurer qu’une action spécifique n’est disponible que pour les utilisateurs Admin en décorant la demande avec l’attribut [Authorize(Roles = "Admin")]. Vous pouvez également vérifier si un utilisateur occupe un rôle spécifique à partir du code en appelant User.IsInRole("Admin") à l’intérieur de votre contrôleur.

Le logiciel médiateur ASP.NET OIDC ajoutera automatiquement toutes les demandes renvoyées dans le JWT en tant que demandes à l’identité ClaimsIdentity. Nous devrions donc extraire les informations de la demande authorization, désérialiser le corps JSON de la demande et, pour chacun des groupes, ajouter une demande http://schemas.microsoft.com/ws/2008/06/identity/claims/role à ClaimsIdentity.

app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions("Auth0")
{
    // Some configuration omitted for brevity

    Events = new OpenIdConnectEvents
    {
        OnTicketReceived = context =>
        {
            var options = context.Options as OpenIdConnectOptions;

            // Get the ClaimsIdentity
            var identity = context.Principal.Identity as ClaimsIdentity;
            if (identity != null)
            {
                // Add the groups as roles
                var authzClaim = context.Principal.FindFirst(c => c.Type == "authorization");
                if (authzClaim != null)
                {
                    var authorization = JsonConvert.DeserializeObject<Auth0Authorization>(authzClaim.Value);
                    if (authorization != null)
                    {
                        foreach (var group in authorization.Groups)
                        {
                            identity.AddClaim(new Claim(ClaimTypes.Role, group, ClaimValueTypes.String, options.Authority));
                        }
                    }
                }
            }

            return Task.FromResult(0);
        }
    }
});

Was this helpful?

/

Ensuite, nous pouvons ajouter une action qui permet aux Administrateurs d’approuver les feuilles de temps :

[Authorize(Roles = "Admin")]
public IActionResult TimesheetApproval()
{          
    return View();
}

Was this helpful?

/