Il s'agit d'une procédure assez simple, exposée par le biais d'API publiques ( IIdentityServerInteractionService
) dans l'IDS4. Il s'agit d'un exemple très simplifié des étapes à suivre. Il couvre à la fois le signout du canal de départ et le signout du canal d'arrivée, car les deux sont déclenchés par la demande adressée à la fonction SignOutIFrameUrl
.
Nous devons d'abord créer un contexte de déconnexion et rediriger vers une action qui effectuera la déconnexion :
var signoutId = await _identityInteractionService.CreateLogoutContextAsync();
return RedirectToAction(nameof(ClientSignout), new { signoutId });
Action ClientSignout :
var context = await _identityInteractionService.GetLogoutContextAsync(signoutId);
ViewBag.SignOutIframeUrl = context.SignOutIFrameUrl;
return View();
ClientSignout.cshtml :
<iframe src="@ViewBag.SignOutIframeUrl" id="SignOutIframe" frameborder="0" scrolling="no" style="display:none" />
//TODO: Detect client-side once iframe has loaded and then maybe redirect somewhere else?
Le code ici ne touche pas du tout à la session d'authentification en cours, mais une autre solution consisterait à forcer un rafraîchissement de l'ID de session en cours et donc à déclencher un rafraîchissement dans tous les clients ayant mis en place un suivi de session.
ETA : plus j'y pense, plus je pense que l'approche du contrôle de session côté client est la bonne. Le client a le contrôle sur ce qu'il doit faire ensuite. Une autre option est que le client fasse des appels périodiques au point de terminaison userinfo pour obtenir des réclamations mises à jour en utilisant le jeton d'accès fourni. En fait, nous utilisons les trois mécanismes à bon escient.
Octobre 2020 : En outre, je pense que, de nos jours, je préférerais utiliser la spécification de la voie de retour de l'OIDC : https://openid.net/specs/openid-connect-backchannel-1_0.html
J'ai récemment réalisé un PoC dans lequel un code de backend peut mettre fin à des sessions client pour un ensemble donné d'utilisateurs et de clients sans impliquer le navigateur de l'utilisateur. C'est très utile si l'on veut forcer la réauthentification en raison de changements de politique ou d'une fonction "sign me out everywhere" dans l'IDP.
Il convient toutefois de noter que la norme identityserver4
Le code doit être modifié pour que cela fonctionne, car il est actuellement supposé qu'il ne sera utilisé que dans le cadre du processus normal de signature.