Aller au contenu principal

OpenID Connect

Lagoon expose une méthode d'extension AddOidc pour enregistrer un fournisseur OpenID Connect côté serveur.

Référence NuGet​

Obsolète

Il n'est plus nécessaire d'ajouter explicitement le package Microsoft.AspNetCore.Authentication.OpenIdConnect lorsque vous utilisez la méthode AddOidc.

Enregistrer le service​

Ajoutez les espaces de noms utiles dans le fichier Main.cs du projet serveur.

Server\Main.cs
using Microsoft.IdentityModel.Protocols.OpenIdConnect;
using Microsoft.IdentityModel.Tokens;
using System.Security.Claims;

Dans OnConfigureServices, enregistrez le fournisseur OIDC.

Server\Main.cs
protected override void OnConfigureServices(IServiceCollection services)
{
Services.Registry.RegisterServices(services);

IConfiguration config = Configuration;
services.AddAuthentication().AddOidc("SSO", "Explicit", options =>
{
options.Authority = config["Oidc:Authority"];
options.ClientId = config["Oidc:ClientId"];
options.ClientSecret = config["Oidc:ClientSecret"];
options.CallbackPath = "/sso-callback";
options.ResponseType = OpenIdConnectResponseType.Code;
options.Scope.Add("openid");
options.Scope.Add("profile");
options.Scope.Add("email");
options.TokenValidationParameters = new TokenValidationParameters
{
// Utilise l'adresse e-mail comme nom de l'identité ASP.NET Core.
NameClaimType = ClaimTypes.Email
};
});
}
appsettings.json
{
"Oidc": {
"Authority": "https://identity-provider.example",
"ClientId": "client-id",
"ClientSecret": "client-secret"
}
}

Okta et gestion des groupes​

Avec Okta, ajoutez le scope groups pour recevoir les groupes de l'utilisateur dans les claims de retour.

Server\Main.cs
services.AddAuthentication().AddOidc("SSO", "Explicit", options =>
{
options.Authority = config["Oidc:Authority"];
options.ClientId = config["Oidc:ClientId"];
options.ClientSecret = config["Oidc:ClientSecret"];
options.CallbackPath = "/sso-callback";
options.ResponseType = OpenIdConnectResponseType.Code;
options.Scope.Add("openid");
options.Scope.Add("profile");
options.Scope.Add("email");
options.Scope.Add("groups");
options.TokenValidationParameters = new TokenValidationParameters
{
// Utilise l'adresse e-mail comme nom de l'identité ASP.NET Core.
NameClaimType = ClaimTypes.Email
};
});

Les groupes peuvent ensuite être lus dans le contexte d'authentification.

Server\Main.cs
protected override Task OnSignInAsync(AuthenticationContext context, ApplicationUser user)
{
string groups = context.IdentitySource.Claims?
.Where(claim => claim.Type == "groups")
.FirstOrDefault()?.Value;

return Task.CompletedTask;
}

Reconnexion forcée​

Avec OIDC, vous pouvez demander à un utilisateur déjà authentifié de se reconnecter pour réaliser une action critique. Il n'y a rien à faire côté configuration OIDC : le support est embarqué dans AddOidc.

Côté client​

Appelez ReconnectAsync. La méthode ouvre une popup vers le SSO OIDC configuré. Une fois le processus terminé, vous obtenez un Guid à transmettre au backend sur l'endpoint qui exige une reconnexion.

Client
private async Task DoSomethingAsync()
{
Guid? id = await App.ReconnectAsync();
if (id.HasValue)
{
List<string> data = await Http.TryGetAsync<List<string>>($"api/monController/monAction?reconnectId={id}");
}
else
{
// L'utilisateur a fermé la popup ou la reconnexion a échoué.
ShowWarning("#reconnectionFailed");
}
}

Côté serveur​

Appelez ValidateReconnectionAsync avec l'identifiant récupéré par ReconnectAsync. La méthode déclenche une exception si reconnectId n'est pas valide ou ne correspond pas à l'identité de l'utilisateur connecté.

Server\Controllers\MonController.cs
[Authorize(Policy = Policies.AuthenticatedUser)]
[HttpGet]
public async Task<IEnumerable<string>> Get(string reconnectId)
{
// Vérifie que l'utilisateur s'est bien reconnecté pour cette demande.
await _app.ValidateReconnectionAsync(reconnectId);
return Array.Empty<string>();
}

Remarques​

  • La reconnexion forcée est seulement supportée si le SSO configuré utilise le protocole OIDC.
  • En développement, si vous utilisez une authentification formulaire, vous pouvez définir App:ReconnectionDisabled à true. Dans ce cas, ReconnectAsync retourne un identifiant et ValidateReconnectionAsync le considère comme valide.
  • Cas particulier avec Cognito configuré pour relayer l'authentification vers un autre IDP OIDC : spécifiez le fournisseur à utiliser avec Lagoon:SSOReconnectProviderName.
appsettings.Development.json
{
"App": {
"ReconnectionDisabled": true
},
"Lagoon": {
"SSOReconnectProviderName": "LeNomDuProviderConfigureDansCognito"
}
}