J'ai écrit un SPA écrit en Angular, et j'utilise l'authentification par jeton Azure AD, avec des ressources (comme des API) qui sont sécurisées par des jetons de support. Cela permet au SPA de récupérer des jetons de renouvellement depuis Azure et de rester connecté en permanence, pour autant que je sache, pour toujours.Déconnexion forcée ADAL JS dans SPA
J'utilise la bibliothèque JavaScript pour ADAL angulaire de le faire:
https://github.com/AzureAD/azure-activedirectory-library-for-js
Maintenant, il est nécessaire de limiter la session d'utilisateurs à quantité prédéterminée de temps, disons 15 heures.
J'ai écrit un joli petit service qui stocke un cookie lors de la connexion, chaque demande vérifie la date dans le cookie et si elles ont dépassé leur limite de session maximale. Cela fonctionne bien si l'utilisateur utilise continuellement l'application, ou ferme le navigateur - mais s'il laisse son navigateur ouvert, le jeton sera simplement renouvelé en arrière-plan et ils resteront connectés.
J'essaie maintenant de résoudre ce problème en utilisant une solution de déconnexion silencieuse. Ce qui signifie, je voudrais que l'utilisateur soit forcé à la page de connexion sécurisée une fois que leur session a expiré.
Cela semble être un scénario courant, mais je n'arrive pas à comprendre comment y parvenir, car ADAL utilise un iFrame en arrière-plan. J'ai pensé à utiliser une minuterie/intervalle, mais cela semble hokey.
Juste pour info J'utilise adalAuthenticationService.logout() par mon exemple de code ci-dessous. J'ai également essayé d'effacer le cache de session, ce qui fonctionne - mais ADAL rafraîchira silencieusement le jeton. J'ai également essayé de placer l'emplacement de redirectUri à une page non authentifiée, mais quand même, il redirigera seulement là si l'utilisateur prend l'action. Si le navigateur reste simplement ouvert, le jeton se réinitialisera tout seul.
var maxTime = 15; // hours allowed in session
// event to fire check; maybe this can be different, and is my problem?
$rootScope.$on('$viewContentLoaded', function() {
$scope.checkLogoutCookie();
});
$scope.logout = function() {
adalAuthenticationService.logout();
};
function setCookie(c) {} // implementation details don't matter....
function getCookie(c) {} // implementation details don't matter....
$scope.checkLogoutCookie = function() {
var lastLogin = getCookie("lastLogin");
var loginDate = new Date();
if (lastLogin === "") { // is empty
setCookie("lastLogin", loginDate, 365);
} else {
var lastDate = new Date(lastLogin);
var hours = Math.abs(lastDate - loginDate)/36e5;
if (hours > maxTime) {
setCookie("lastLogin", "", 0);
$scope.logout();
}
}
}
Ceci ne fournit pas de réponse à la question. Une fois que vous avez suffisamment [réputation] (https://stackoverflow.com/help/whats-reputation) vous pourrez [commenter n'importe quel article] (https://stackoverflow.com/help/privileges/comment); Au lieu de cela, [fournissez des réponses qui ne nécessitent pas de précisions de la part du demandeur] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- je-fais-à la place). - [À revoir] (/ review/low-quality-posts/17680085) –
Oui !. Merci pour la note. J'ai changé ma réponse selon la règle. –