SAML 2.0 セッションタイムアウト後のシングルログアウトについて
SAML 2.0 シングル サインオン (SSO) システムでは、ユーザーは単一セットの資格情報を使用してさまざまなアプリケーションにサインインできるため、ユーザー認証が大幅に簡素化されます。しかし、シングル ログアウト (SLO) の概念には、特に、ユーザーがログインしていないためにサービス プロバイダー (SP) でのセッションが期限切れになった場合に何が起こるかに関して、重大な問題もあります。この場合、アイデンティティ プロバイダーは、 (IDP) セッションも終了しますか?
SP と IDP 間のセッション管理は、SAML 2.0 のコンテキストで安全かつ効率的なアクセスを確保するために不可欠です。 SP セッションが終了したときに、ユーザーが引き続き IDP に接続する必要があるかどうかは必ずしも明らかではありません。これは、同じ IDP にリンクされている他のアプリに影響を与える可能性があります。これにより、ユーザビリティだけでなくセキュリティについても疑問が生じます。
これらのセッション タイムアウトを処理するための明確なベスト プラクティスは、多くの企業、特に Microsoft Entra のようなインターフェイスを使用する企業によって確立される必要があります。 SP のセッションは単純に SP レベルで停止する方が良いのでしょうか、それとも、ユーザーを IDP アカウントからログアウトさせる SLO も発生させる必要がありますか?
このペーパーでは、実際の例を使用して、セッション タイムアウトを処理し、セキュリティと使いやすさの両方を保証するための最も効率的な手法を説明し、そのような状況で SAML 2.0 SLO イベントを処理するための標準的な実践方法と標準を検討します。
指示 | 使用例 |
---|---|
session() | Express アプリケーションでユーザー セッションを制御するために使用されます。この例では、必要に応じてログアウト ロジックをトリガーできるように、ユーザー アクティビティとセッション タイムアウトの監視を支援します。 |
maxAge | セッション Cookie が有効である期間を指定します。この例では、タイマーは 600000 ミリ秒、つまり 10 分後に期限切れになり、ログアウト イベントが開始されるように設定されています。 |
create_logout_request_url() | サービス プロバイダー セッションが終了すると、この SAML2 ライブラリ メソッドによって作成されたシングル ログアウト (SLO) リクエスト URL がアイデンティティ プロバイダー (IDP) に転送されます。 |
readFileSync() | SAML2 サービス プロバイダーのセットアップに必要なキー ファイルと証明書を同期的に読み取ります。サービス プロバイダーと ID プロバイダーが安全に通信するには、これらの認証が必要です。 |
assert_endpoint | 認証が成功した後、アイデンティティ プロバイダーが SAML アサーションを送信するために使用する URL を示します。これにより、サービスプロバイダーレベルのユーザー認証が保証されます。 |
window.onload | このイベントは、フロントエンドのセッション非アクティブ タイマーをリセットするために使用されます。これにより、ユーザーが初めてプログラムをロードしたときにタイマーが最初から開始されるようになります。 |
onmousemove | セッション タイマーをリセットするために、このイベント リスナーはマウスの動きを検出します。これは、ユーザーの行動を監視し、偶発的なセッション タイムアウトを回避するために不可欠です。 |
fetch() | セッションタイムアウト後に、SLO リクエストをサーバーに非同期的に送信するために使用されます。 ID プロバイダーに接続してユーザーを IDP からログアウトするために、バックエンド ロジックを開始します。 |
setTimeout() | フロントエンド コードのこの関数により、非アクティブ状態が所定時間続いた後にセッション タイムアウト イベントが発生します。ユーザーの行動を監視し、セキュリティ規制を導入するためには不可欠です。 |
SAML 2.0 セッション タイムアウト処理によるシングル ログアウトの最適化
使用する Express は、シングル ログアウト (SLO) を処理するバックエンド スクリプトで、ユーザー セッションの有効期限を追跡し、サービス プロバイダー (SP) およびアイデンティティ プロバイダー (IDP) レベルでログアウト シーケンスを開始する機能に重点を置いています。 Express セッションの管理は、この推論の中心にあります。所定の非アクティブ時間が経過した後 (この例では 10 分間) にセッションが終了するように設定することで、トリガー ポイントを確立します。セッションが終了すると、スクリプトは `create_logout_request_url()} メソッドを使用して SAML 2.0 ログアウト要求を開始し、IDP に接続します (この場合、 ) ユーザーセッションを完全に終了します。これにより、ユーザーがシステムから完全にログアウトしたことが保証され、セキュリティが強化されます。
ロードします `readFileSync()} コマンドを使用してアプリケーションにキーを入力し、SP (MyApp) と IDP (Microsoft Entra) 間の安全な通信を可能にします。これらの証明書は、ログアウト要求を認証することにより、不正なログアウトを防ぎ、通信の暗号化と確認が維持されることを保証します。ユーザーは、生成されたログアウト要求 URL に送信され、IDP がログアウトを処理し、必要に応じて、関連するアプリケーション間でのユーザーのセッションを終了します。マルチアプリケーション シングル サインオン (SSO) インストールのセキュリティと整合性を維持するには、この双方向通信が必要です。
JavaScript スクリプトは、フロントエンドでユーザーのアクティビティをリアルタイムで追跡するために不可欠です。ユーザーがプログラムと対話するたびに、`onmousemove} や `onkeypress` などのイベント リスナーを使用してセッション タイムアウトをリセットします。 `setTimeout()` で設定されたタイマーはユーザーに警告を発し、ユーザーがアイドル状態になると SP (MyApp) から自動的にログアウトします。ログアウトに続いて、前に説明した SAML 2.0 ログアウト プロセスが、「fetch()」を使用してバックエンドに SLO リクエストを送信するフロントエンド スクリプトによって開始されます。この技術により、SP レベルでの非アクティブ状態が迅速かつ安全に、確実に対処されるようになります。
SAML 2.0統合時と を組み合わせることで、ユーザー エクスペリエンスはシームレスになり、セキュリティ標準が維持されます。ユーザーが非アクティブ時に許可されている期間を超えて認証されたままになるのを防ぐために、セッション タイムアウトにより、ローカル SP ログアウトと IDP ログアウトの両方が開始されます。 SAML 2.0 ではセッション タイムアウトに関して特別な操作は必要ありませんが、SLO を開始するためにセッションの有効期限を使用することがベスト プラクティスとして一般に受け入れられています。アイドル セッションを終了することで、SSO に接続されたさまざまなプラットフォーム間で同期されたログアウトが可能になり、セキュリティとユーザー エクスペリエンスのバランスが取れます。
Node.js と Express を使用してセッション タイムアウトのある SAML 2.0 シングル ログアウトを処理する
Node.js と Express を利用して、サービス プロバイダーのセッション タイムアウトで SAML 2.0 SLO を管理するバックエンド メソッド。このソリューションは、SAML リクエストを使用してセッションの有効期限が切れているかどうかを確認し、アイデンティティ プロバイダー レベルで SLO を開始します。
// Required modules for Node.js and SAML SSO
const express = require('express');
const session = require('express-session');
const saml2 = require('saml2-js');
const app = express();
// Service Provider (SP) setup
const sp = new saml2.ServiceProvider({
entity_id: "http://myapp.com/metadata.xml",
private_key: fs.readFileSync("./cert/sp-private-key.pem").toString(),
certificate: fs.readFileSync("./cert/sp-certificate.pem").toString(),
assert_endpoint: "http://myapp.com/assert"
});
// Identity Provider (IDP) setup
const idp = new saml2.IdentityProvider({
sso_login_url: "https://login.microsoftonline.com/sso",
sso_logout_url: "https://login.microsoftonline.com/logout",
certificates: fs.readFileSync("./cert/idp-certificate.pem").toString()
});
// Session management
app.use(session({
secret: 'mySecretKey',
resave: false,
saveUninitialized: true,
cookie: { maxAge: 600000 } // Set session expiration time
}));
// Middleware to handle session timeout and SLO
app.use((req, res, next) => {
if (req.session.expires && Date.now() > req.session.expires) {
sp.create_logout_request_url(idp, {}, (err, logout_url) => {
if (err) return res.status(500).send("Logout error");
return res.redirect(logout_url); // Trigger SLO
});
} else {
next(); // Continue if session is valid
}
});
app.listen(3000, () => {
console.log("Server running on port 3000");
});
JavaScript フロントエンドとアイドル タイムアウト検出を使用して SAML 2.0 SLO を処理する
フロントエンド メソッドでは、バニラ JavaScript を利用してユーザーの非アクティブ状態を監視し、シングル ログアウト (SLO) を開始することによってセッション タイムアウトが検出されます。これにより、サービス プロバイダーは、アイデンティティ プロバイダーに SLO リクエストを発行するように指示されます。
// Define variables for session timeout
let timeoutDuration = 600000; // 10 minutes
let timeoutTimer;
// Reset the timer on any user interaction
function resetTimer() {
clearTimeout(timeoutTimer);
timeoutTimer = setTimeout(triggerLogout, timeoutDuration);
}
// Trigger logout function
function triggerLogout() {
alert("Session expired due to inactivity.");
window.location.href = "/logout"; // Redirect to SP logout
}
// Monitor user actions
window.onload = resetTimer;
document.onmousemove = resetTimer;
document.onkeypress = resetTimer;
// SLO event triggered after logout
function sendSLORequest() {
fetch('/api/slo', { method: 'POST' })
.then(response => {
if (response.ok) {
console.log("SLO request sent to IDP");
}
})
.catch(err => console.error("SLO request failed", err));
}
SAML 2.0 の探索: シングル ログアウトと非アクティブ タイムアウト
SAML 2.0 シングル ログアウト (SLO) の対処方法 サービス プロバイダー (SP) レベルでの管理は重要なコンポーネントです。 SP での手動ログアウトによってアイデンティティ プロバイダー (IDP) のログアウトも発生することは明らかですが、非アクティブな状態によって引き起こされるセッション タイムアウトが問題を複雑にします。 SAML 2.0 標準では、セッションの有効期限が切れたときに SLO をどのように処理するかについて明確に規定されていません。ただし、これにより、ユーザー エクスペリエンスとセキュリティを向上させるベスト プラクティスの採用が可能になります。
たとえば、非アクティブなために SP からシャットアウトされた後でも、Microsoft Entra (IDP) を通じて MyApp などのアプリケーションにログインするユーザーは、頻繁に IDP にログインしたままになります。同じ SSO を利用する他のアプリがまだ実行されているときに、ユーザーが完全にログアウトされたと信じている場合、これにより問題が発生する可能性があります。 。 SAML セッション管理を設定して IDP レベルで SP タイムアウト イベントを模倣し、同期されたログアウトを保証することは、このリスクを軽減する 1 つの方法です。
フロントエンド コードのアイドル検出技術の実装も別の要因です。開発者は、ユーザー アクティビティのイベント リスナーを使用することで、非アクティブ時間を予測し、セッションが期限切れになる前にユーザーに警告することができます。これを使用すると、ユーザーは自分のセッションを制御し続け、自分のセッションを確実に実行できます。 連続的に実行されません。 SSO が統合された環境では、開発者はこれらの要素のバランスを取ることで、セキュリティとユーザーの快適さを維持できます。
- セッションがタイムアウトすると、サービス プロバイダー レベルで何が起こりますか?
- 通常、SP レベルでセッションがタイムアウトすると、ユーザーはプログラムからログアウトされます。ただし、SAML 2.0 仕様では、これによって IDP で SLO が発生することは要求されていないため、これはシステムの設定方法によって異なります。
- アイデンティティ プロバイダーの SLO は、サービス プロバイダーのセッション タイムアウトによってトリガーされる必要がありますか?
- これは組織のポリシーによって管理されます。 SAML 2.0 では必須ではありませんが、多くの場合、セキュリティ上の理由から、SP セッションの終了時に IDP で SLO を開始することを選択しています。
- 非アクティブなセッションが終了したとき、SLO を発生させるにはどうすればよいですか?
- セッションの有効期限はバックエンド メカニズムを通じて検出でき、バックエンド メカニズムによってセッションが開始されます。 IDP に SLO リクエストを行う手順。
- セッションの非アクティブ状態はフロントエンドでどのように検出されますか?
- イベントリスナーは次のようになります そして ユーザーがアプリケーションを操作するたびにタイマーがリセットされるため、非アクティブ状態を追跡するために一般的に使用されます。
- SP からログアウトした後、IDP セッションを開いたままにしても安全ですか?
- 特にユーザーが完全にチェックアウトしたと信じている場合、IDP セッションを開いたままにすると、セキュリティ リスクが発生する可能性があります。 SP セッションの有効期限を複製するように SLO を設定することをお勧めします。
SSO システムでセキュリティを維持するには、アイデンティティ プロバイダーとサービス プロバイダーがログアウト プロセスを同期していることを確認する必要があります。 SAML 2.0 ではセッション タイムアウトの処理方法は規定されていませんが、多くの企業はシングル ログアウトを統一した方法で処理しています。
セキュリティを向上させるために、非アクティブなためにサービス プロバイダー セッションが終了するたびに SLO リクエストを送信することをお勧めします。これにより、ユーザーはアプリケーションだけでなくアイデンティティ プロバイダーからも確実にログアウトされ、多くのプラットフォームでの不要なアクセスが回避されます。
- SAML 2.0 およびシングル ログアウトの標準とガイドラインに関する詳細なドキュメントは、公式ドキュメントにあります。 OASIS SAML 2.0 コア仕様 。
- Microsoft Entra とその SSO および SLO との統合については、Microsoft の公式ドキュメントを参照してください。 Azure Active Directory と SAML 。
- 例で使用されている Node.js SAML ライブラリとセッション管理手法については、次の URL でさらに詳しく調べることができます。 SAML2-js ライブラリのドキュメント 。
- シングル サインオンとセッション管理の構成に関するベスト プラクティスを理解するには、次の記事を参照してください。 SSO のベスト プラクティス 著者:Auth0。