私はAngularで書かれたSPAを書いており、ベアラトークンで保護されているリソース(APIなど)とともにAzure ADトークンベースの認証を使用しています。これにより、SPAはAzureから更新トークンを取得し、私が知る限り永遠にログインし続けることができます。私はこれを行うに角度のためADAL JavaScriptライブラリを使用していますADAL JS SPAの強制ログアウト
:
https://github.com/AzureAD/azure-activedirectory-library-for-js
今すぐ所定の時間にユーザーセッションを制限する必要があり、15時間を言うことができます。
私は、ログイン時にCookieを保存する素敵な小さなサービスを書いていました。すべてのリクエストはCookieの日付をチェックし、最大セッション制限を超えています。ユーザーがアプリを継続的に使用している場合やブラウザを閉じている場合は正常に動作しますが、ブラウザを開いたままにしておくと、トークンはバックグラウンドで更新され、ログインしたままです。
私は今、サイレント・サインアウト・ソリューションを使用します。意味、セッションが終了すると、ユーザーにSecure Sign In Pageを余儀なくされるようにしたいと思います。
これは一般的なシナリオのようですが、ADALはiFrameをバックグラウンドで使用するため、これを達成する方法を理解できないようです。私はタイマー/インターバルを使用することを考えましたが、それは厄介なようです。
私は以下のコードサンプルでadalAuthenticationService.logout()を使用しています。セッションキャッシュのクリアを試みましたが、ADALは自動的にトークンを更新します。私はまた、認証されていないページにredirectUriの場所を設定しようとしましたが、それでも、ユーザーがアクションを取った場合にのみリダイレクトされます。ブラウザが単に開いたままの場合、トークンは単にリセットされます。
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();
}
}
}
これは質問に対する答えを提供しません。十分な[評判](https://stackoverflow.com/help/whats-reputation)があれば、[投稿にコメントする]ことができます(https://stackoverflow.com/help/privileges/comment)。代わりに、[質問者からの明確化を必要としない回答を提供する](https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- i-do-代わりに)。 - [レビューの投稿](レビュー/低品質の投稿/ 17680085) –
はい!メモをありがとう。私はルールに従って答えを変えました。 –