OpenID Connect
Lagoon expose une méthode d'extension AddOidc pour enregistrer un fournisseur OpenID Connect côté serveur.
Référence NuGet
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.
using Microsoft.IdentityModel.Protocols.OpenIdConnect;
using Microsoft.IdentityModel.Tokens;
using System.Security.Claims;
Dans OnConfigureServices, enregistrez le fournisseur OIDC.
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
};
});
}
{
"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.
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.
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.
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é.
[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,ReconnectAsyncretourne un identifiant etValidateReconnectionAsyncle 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.
{
"App": {
"ReconnectionDisabled": true
},
"Lagoon": {
"SSOReconnectProviderName": "LeNomDuProviderConfigureDansCognito"
}
}