Hiểu SAML 2.0 Đăng xuất một lần sau khi hết thời gian phiên
Vì hệ thống Đăng nhập một lần (SSO) SAML 2.0 cho phép người dùng đăng nhập vào nhiều ứng dụng khác nhau bằng một bộ thông tin xác thực duy nhất nên chúng đã đơn giản hóa đáng kể quá trình xác thực người dùng. Nhưng cũng có những vấn đề quan trọng với khái niệm Đăng xuất một lần (SLO), đặc biệt liên quan đến những gì xảy ra khi phiên của người dùng hết hạn tại Nhà cung cấp dịch vụ (SP) do họ chưa đăng nhập. Trong trường hợp này, Nhà cung cấp danh tính có nên đăng nhập không? (IDP) phiên cũng kết thúc?
Quản lý phiên giữa SP và IDP là điều cần thiết để đảm bảo quyền truy cập an toàn và hiệu quả trong bối cảnh SAML 2.0. Không phải lúc nào cũng rõ ràng khi phiên SP kết thúc nếu người dùng vẫn được kết nối với IDP, điều này có thể ảnh hưởng đến các ứng dụng khác được liên kết với cùng một IDP. Điều này đặt ra câu hỏi về khả năng sử dụng cũng như bảo mật.
Nhiều doanh nghiệp cần phải thiết lập một phương pháp thực hành tốt nhất rõ ràng để xử lý các thời gian chờ phiên này, đặc biệt là những doanh nghiệp sử dụng giao diện như Microsoft Entra. Sẽ tốt hơn nếu phiên của SP chỉ dừng ở cấp độ SP hay điều đó cũng dẫn đến SLO khiến người dùng đăng xuất khỏi tài khoản IDP của họ?
Sử dụng các ví dụ thực tế để minh họa các kỹ thuật hiệu quả nhất để xử lý thời gian chờ của phiên cũng như đảm bảo cả tính bảo mật và khả năng sử dụng, bài viết này xem xét các phương pháp và tiêu chuẩn tiêu chuẩn để xử lý các sự kiện SAML 2.0 SLO trong những tình huống như vậy.
Yêu cầu | Ví dụ về sử dụng |
---|---|
session() | Được sử dụng trong ứng dụng Express để kiểm soát phiên của người dùng. Trong ví dụ này, nó hỗ trợ giám sát hoạt động của người dùng và thời gian chờ của phiên để có thể kích hoạt logic đăng xuất khi cần. |
maxAge | Chỉ định khung thời gian mà cookie phiên hợp lệ. Trong trường hợp này, bộ hẹn giờ được đặt hết hạn sau 600000 mili giây hoặc 10 phút và bắt đầu sự kiện đăng xuất. |
create_logout_request_url() | Khi phiên Nhà cung cấp dịch vụ kết thúc, URL yêu cầu Đăng xuất một lần (SLO) được tạo bằng phương pháp thư viện SAML2 này sẽ được chuyển tiếp đến Nhà cung cấp danh tính (IDP). |
readFileSync() | Đọc các tệp chính và chứng chỉ một cách đồng bộ, điều này cần thiết để thiết lập Nhà cung cấp dịch vụ SAML2. Để Nhà cung cấp dịch vụ và Nhà cung cấp danh tính liên lạc một cách an toàn, những chứng nhận này là cần thiết. |
assert_endpoint | Cho biết URL mà sau khi xác thực thành công, Nhà cung cấp danh tính sẽ sử dụng để truyền xác nhận SAML. Bằng cách này, mức độ xác thực người dùng của Nhà cung cấp dịch vụ được đảm bảo. |
window.onload | Sự kiện này được sử dụng để đặt lại bộ đếm thời gian không hoạt động của phiên ở giao diện người dùng. Nó đảm bảo rằng khi người dùng tải chương trình lần đầu tiên, bộ đếm thời gian sẽ bắt đầu lại. |
onmousemove | Để đặt lại bộ hẹn giờ phiên, trình xử lý sự kiện này sẽ phát hiện bất kỳ chuyển động nào của chuột. Điều cần thiết là phải theo dõi hành vi của người dùng và tránh tình trạng hết thời gian phiên do vô tình. |
fetch() | Được sử dụng để gửi yêu cầu SLO không đồng bộ đến máy chủ sau thời gian chờ của phiên. Để kết nối với Nhà cung cấp danh tính và đăng xuất người dùng khỏi IDP, nó sẽ kích hoạt logic phụ trợ. |
setTimeout() | Hàm này trong mã giao diện người dùng khiến sự kiện hết thời gian phiên xảy ra sau một khoảng thời gian không hoạt động được xác định trước. Điều cần thiết là phải theo dõi hành vi của người dùng và thực hiện các quy định bảo mật. |
Tối ưu hóa đăng xuất một lần bằng cách xử lý thời gian chờ phiên SAML 2.0
sử dụng và Express, tập lệnh phụ trợ để xử lý Đăng xuất một lần (SLO) tập trung vào khả năng theo dõi hết hạn phiên của người dùng và bắt đầu trình tự đăng xuất ở cấp độ Nhà cung cấp dịch vụ (SP) và Nhà cung cấp danh tính (IDP). Việc quản lý các phiên Express nằm ở trung tâm của lý do này. Chúng tôi thiết lập điểm kích hoạt bằng cách đặt phiên kết thúc sau một khoảng thời gian không hoạt động được xác định trước—trong ví dụ của chúng tôi là 10 phút. Khi phiên kết thúc, tập lệnh sử dụng phương thức `create_logout_request_url()} để bắt đầu yêu cầu đăng xuất SAML 2.0, sau đó kết nối với IDP (trong trường hợp này là ) để kết thúc hoàn toàn phiên người dùng. Điều này tăng cường bảo mật bằng cách đảm bảo rằng người dùng đã đăng xuất hoàn toàn khỏi hệ thống.
Chúng tôi tải và khóa vào ứng dụng bằng lệnh `readFileSync()} để cho phép liên lạc an toàn giữa SP (MyApp) và IDP (Microsoft Entra). Bằng cách xác thực yêu cầu đăng xuất, các chứng chỉ này bảo vệ chống lại việc đăng xuất bất hợp pháp và đảm bảo rằng thông tin liên lạc luôn được mã hóa và xác nhận. Người dùng được gửi đến URL yêu cầu đăng xuất sau khi URL được tạo, trong đó IDP xử lý việc đăng xuất và, nếu được yêu cầu, sẽ kết thúc phiên của người dùng trên mọi ứng dụng được liên kết. Việc duy trì tính bảo mật và tính toàn vẹn của quá trình cài đặt Đăng nhập một lần (SSO) đa ứng dụng yêu cầu giao tiếp hai chiều này.
Tập lệnh JavaScript rất cần thiết để theo dõi hoạt động của người dùng trong thời gian thực ở giao diện người dùng. Mỗi khi người dùng tương tác với chương trình, chúng tôi sẽ đặt lại thời gian chờ của phiên bằng cách sử dụng các trình xử lý sự kiện như `onmousemove} và `onkeypress`. Bộ hẹn giờ được đặt bằng `setTimeout()` sẽ cảnh báo người dùng và tự động đăng xuất họ khỏi SP (MyApp) khi người dùng không hoạt động. Sau khi đăng xuất, quy trình đăng xuất SAML 2.0 được đề cập trước đó được bắt đầu bằng tập lệnh giao diện người dùng gửi yêu cầu SLO tới chương trình phụ trợ bằng cách sử dụng `fetch()`. Kỹ thuật này đảm bảo rằng việc không hoạt động ở cấp độ SP được giải quyết kịp thời, an toàn và không bị lỗi.
Khi tích hợp SAML 2.0 và được kết hợp, trải nghiệm người dùng liền mạch và các tiêu chuẩn bảo mật được duy trì. Để ngăn người dùng duy trì trạng thái xác thực lâu hơn mức cho phép khi không hoạt động, thời gian chờ của phiên sẽ bắt đầu cả đăng xuất SP cục bộ và đăng xuất IDP. Mặc dù SAML 2.0 không yêu cầu bất kỳ hành vi cụ thể nào liên quan đến thời gian chờ của phiên nhưng thường được chấp nhận là phương pháp hay nhất để sử dụng hết hạn phiên để bắt đầu SLO. Bằng cách kết thúc các phiên không hoạt động, nó tạo ra sự cân bằng giữa bảo mật và trải nghiệm người dùng bằng cách cho phép đăng xuất được đồng bộ hóa trên nhiều nền tảng được kết nối SSO khác nhau.
Sử dụng Node.js và Express để xử lý đăng xuất một lần SAML 2.0 khi hết thời gian phiên
Phương pháp phụ trợ để quản lý SAML 2.0 SLO với thời gian chờ phiên của Nhà cung cấp dịch vụ sử dụng Node.js và Express. Giải pháp này sử dụng các yêu cầu SAML để kiểm tra xem phiên đã hết hạn chưa và khởi tạo SLO ở cấp Nhà cung cấp danh tính.
// 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");
});
Sử dụng JavaScript Frontend và Phát hiện thời gian chờ không hoạt động để xử lý SAML 2.0 SLO
Trong phương thức giao diện người dùng, thời gian chờ của phiên được phát hiện bằng cách sử dụng JavaScript thuần để giám sát việc người dùng không hoạt động và bắt đầu Đăng xuất một lần (SLO). Điều này yêu cầu Nhà cung cấp dịch vụ đưa ra yêu cầu SLO cho Nhà cung cấp danh tính.
// 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));
}
Khám phá SAML 2.0: Đăng xuất một lần và hết thời gian không hoạt động
Cách xử lý địa chỉ đăng xuất một lần (SLO) SAML 2.0 ở cấp độ Nhà cung cấp dịch vụ (SP) là một thành phần quan trọng cần quản lý. Mặc dù rõ ràng rằng việc đăng xuất thủ công tại SP cũng sẽ khiến Nhà cung cấp nhận dạng (IDP) đăng xuất, nhưng thời gian chờ của phiên do không hoạt động sẽ làm phức tạp thêm vấn đề. Tiêu chuẩn SAML 2.0 không nêu rõ cách xử lý SLO khi phiên hết hạn. Tuy nhiên, điều này cho phép áp dụng các phương pháp hay nhất có thể cải thiện trải nghiệm và bảo mật của người dùng.
Ví dụ: ngay cả sau khi bị tắt SP do không hoạt động, người dùng đăng nhập vào một ứng dụng như MyApp thông qua Microsoft Entra (IDP) vẫn thường xuyên đăng nhập vào IDP. Nếu người dùng cho rằng họ đã đăng xuất hoàn toàn trong khi các ứng dụng khác sử dụng cùng SSO vẫn đang chạy, điều này có thể tăng . Thiết lập quản lý phiên SAML để bắt chước sự kiện hết thời gian SP ở cấp IDP và đảm bảo đăng xuất được đồng bộ hóa là một cách để giảm rủi ro này.
Việc triển khai các kỹ thuật phát hiện nhàn rỗi của mã giao diện người dùng là một yếu tố khác. Nhà phát triển có thể dự đoán thời gian không hoạt động và cảnh báo người dùng trước khi phiên hết hạn bằng cách sử dụng trình xử lý sự kiện cho hoạt động của người dùng. Bằng cách sử dụng điều này, người dùng có thể giữ quyền kiểm soát các phiên của họ và đảm bảo rằng không chạy liên tục. Trong môi trường tích hợp SSO, các nhà phát triển có thể duy trì tính bảo mật và sự thoải mái của người dùng bằng cách tạo ra sự cân bằng giữa các yếu tố này.
- Điều gì xảy ra ở cấp Nhà cung cấp dịch vụ khi hết phiên?
- Thông thường, người dùng đăng xuất khỏi chương trình khi hết phiên ở cấp độ SP. Tuy nhiên, điều này phụ thuộc vào cách thiết lập hệ thống vì thông số SAML 2.0 không yêu cầu điều này gây ra SLO tại IDP.
- SLO tại Nhà cung cấp danh tính có nên được kích hoạt khi hết thời gian chờ của phiên Nhà cung cấp dịch vụ không?
- Chính sách của tổ chức chi phối điều này. Mặc dù SAML 2.0 không bắt buộc phải làm vậy nhưng nhiều người chọn tắt SLO tại IDP khi phiên SP kết thúc vì lý do bảo mật.
- Khi phiên không hoạt động kết thúc, làm cách nào để tôi có thể thực hiện SLO?
- Việc hết hạn phiên có thể được phát hiện thông qua cơ chế phụ trợ, sau đó bắt đầu một quy trình gửi yêu cầu SLO tới IDP.
- Làm cách nào để phát hiện phiên không hoạt động trên giao diện người dùng?
- Người nghe sự kiện thích như Và thường được sử dụng để theo dõi hoạt động không hoạt động khi chúng đặt lại bộ hẹn giờ mỗi khi người dùng tương tác với ứng dụng.
- Sau khi đăng xuất khỏi SP, việc mở phiên IDP có an toàn không?
- Rủi ro bảo mật có thể phát sinh khi để phiên IDP mở, đặc biệt nếu người dùng tin rằng họ đã đăng xuất hoàn toàn. Nên thiết lập SLO để sao chép phiên SP hết hạn.
Việc duy trì bảo mật trong hệ thống SSO yêu cầu đảm bảo rằng Nhà cung cấp danh tính và Nhà cung cấp dịch vụ đồng bộ hóa quy trình đăng xuất của họ. Mặc dù SAML 2.0 không bắt buộc phải xử lý thời gian chờ của phiên như thế nào, nhưng rất nhiều doanh nghiệp xử lý các lần đăng xuất một lần một cách thống nhất.
Bạn nên gửi yêu cầu SLO mỗi khi phiên Nhà cung cấp dịch vụ kết thúc do không hoạt động để cải thiện tính bảo mật. Điều này đảm bảo rằng người dùng đã đăng xuất khỏi Nhà cung cấp danh tính cũng như ứng dụng, tránh những truy cập không mong muốn trên nhiều nền tảng.
- Bạn có thể tìm thấy tài liệu chi tiết về các tiêu chuẩn và nguyên tắc SAML 2.0 và Đăng xuất một lần trong trang web chính thức Thông số kỹ thuật cốt lõi của OASIS SAML 2.0 .
- Để biết thông tin chi tiết về Microsoft Entra và sự tích hợp của nó với SSO và SLO, hãy tham khảo tài liệu chính thức của Microsoft về Azure Active Directory và SAML .
- Thư viện SAML của Node.js được sử dụng trong các ví dụ, cùng với các kỹ thuật quản lý phiên, có thể được khám phá thêm tại Tài liệu thư viện SAML2-js .
- Để hiểu các phương pháp hay nhất trong việc định cấu hình Đăng nhập một lần và quản lý phiên, hãy truy cập bài viết trên Các phương pháp hay nhất về SSO bởi Auth0.