Tổng quan về SAML - Single Sign-On (SSO)
Ngôn ngữ đánh dấu xác nhận bảo mật - Security Assertion Markup Language (SAML) là một tiêu chuẩn để đăng nhập người dùng vào ứng dụng dựa trên phiên đăng nhập mà họ đã có ở nơi khác. Tiêu chuẩn đăng nhập một lần Single Sign-On (SSO) này có những lợi thế đáng kể so với đăng nhập bằng tên người dùng / mật khẩu:
- Không cần nhập thông tin đăng nhập tại từng ứng dụng
- Không cần nhớ và gia hạn nhiều mật khẩu
- Không còn mật khẩu yếu do người dùng tự đặt cho từng ứng dụng
Hầu hết các tổ chức đã biết danh tính của người dùng vì họ đã đăng nhập vào miền Active Directory hoặc mạng nội bộ. Sẽ rất hợp lý khi dùng chính thông tin này để đăng nhập người dùng vào các ứng dụng khác, chẳng hạn ứng dụng web, và SAML là một trong những cách thuận tiện nhất để làm việc đó.
⚡ Điểm nhanh về SAML SSO
- SAML là gì: chuẩn mở của OASIS dùng để trao đổi thông tin xác thực và phân quyền giữa các hệ thống, truyền bằng tài liệu XML có chữ ký số
- Phiên bản đang dùng phổ biến: SAML 2.0, được OASIS công bố chuẩn từ tháng 3/2005 và thay thế SAML 1.1
- Hai vai trò chính: nhà cung cấp danh tính (IdP - nơi xác thực người dùng) và nhà cung cấp dịch vụ (SP - ứng dụng người dùng cần truy cập)
- Thứ được trao đổi: assertion (xác nhận) chứa danh tính người dùng, thời điểm và cách xác thực, cùng các thuộc tính như email, nhóm, vai trò
- Hai luồng đăng nhập: SP-initiated (bắt đầu từ ứng dụng) và IdP-initiated (bắt đầu từ cổng IdP); SP-initiated an toàn hơn
- Khác OAuth 2.0: SAML và OIDC dùng để xác thực (đăng nhập), còn OAuth 2.0 là khung ủy quyền truy cập tài nguyên
- Ứng dụng thực tế: đăng nhập quản trị FortiGate, SSL VPN, cổng captive portal Wi-Fi, ứng dụng SaaS dùng chung một IdP như Microsoft Entra ID, Okta, ADFS
Cách thức hoạt động của SAML
SAML SSO hoạt động bằng cách chuyển danh tính của người dùng từ nơi này (nhà cung cấp danh tính - identity provider) sang nơi khác (nhà cung cấp dịch vụ - service provider). Việc này được thực hiện thông qua trao đổi các tài liệu XML được ký điện tử.
Hãy xem xét tình huống sau: người dùng đã đăng nhập vào hệ thống đóng vai trò nhà cung cấp danh tính. Người dùng muốn đăng nhập vào một ứng dụng từ xa, chẳng hạn ứng dụng hỗ trợ khách hàng hoặc ứng dụng kế toán (nhà cung cấp dịch vụ).
Quy trình diễn ra như sau:
- Người dùng truy cập ứng dụng từ xa bằng liên kết trên mạng nội bộ, dấu trang hoặc tương tự, và ứng dụng được tải.
- Ứng dụng xác định nguồn gốc của người dùng (theo tên miền phụ của ứng dụng, địa chỉ IP của người dùng hoặc tương tự) và chuyển hướng người dùng về nhà cung cấp danh tính, yêu cầu xác thực. Đây là yêu cầu xác thực (AuthnRequest).
- Người dùng đã có phiên trình duyệt đang hoạt động với nhà cung cấp danh tính, hoặc thiết lập phiên bằng cách đăng nhập vào nhà cung cấp danh tính.
- Nhà cung cấp danh tính tạo phản hồi xác thực dưới dạng tài liệu XML chứa tên người dùng hoặc địa chỉ email, ký bằng chứng chỉ X.509 rồi gửi (POST) thông tin này về nhà cung cấp dịch vụ.
- Nhà cung cấp dịch vụ, vốn đã biết nhà cung cấp danh tính và giữ vân tay chứng chỉ (certificate fingerprint), nhận phản hồi xác thực và kiểm tra chữ ký bằng chứng chỉ đó.
- Danh tính của người dùng được thiết lập và người dùng được cấp quyền truy cập ứng dụng.
Sơ đồ bên dưới minh họa quy trình đăng nhập một lần do nhà cung cấp dịch vụ khởi tạo (SP-initiated), tức là khi chính ứng dụng kích hoạt SSO.
Một ví dụ điển hình trong doanh nghiệp: nhân viên đăng nhập một lần vào Microsoft Entra ID (hoặc Okta, ADFS) rồi mở các ứng dụng như Salesforce, Zoom, ServiceNow hay cổng quản trị FortiGate mà không phải nhập lại mật khẩu. Ở đây Entra ID đóng vai trò nhà cung cấp danh tính (IdP), còn mỗi ứng dụng là một nhà cung cấp dịch vụ (SP). Quản trị viên chỉ cần quản lý tài khoản, MFA và quyền truy cập tại một nơi.
Lưu ý: nút "đăng nhập bằng Google/Facebook" trên các website công cộng cũng là SSO nhưng thường chạy trên OAuth 2.0/OpenID Connect, không phải SAML (xem phần so sánh bên dưới).
Các thành phần chính trong SAML
| Thành phần | Vai trò |
|---|---|
| User (Principal) | Người dùng cần truy cập ứng dụng |
| IdP - Identity Provider | Hệ thống xác thực người dùng và phát hành assertion (ví dụ Microsoft Entra ID, ADFS, Okta, FortiAuthenticator) |
| SP - Service Provider | Ứng dụng hoặc thiết bị tin cậy IdP và dựa vào assertion để cho phép truy cập (ví dụ ứng dụng SaaS, cổng quản trị FortiGate) |
| Assertion | Tài liệu XML được ký, chứa các phát biểu về người dùng |
| Metadata | Tệp XML mô tả cấu hình của IdP/SP: entity ID, URL đăng nhập, chứng chỉ ký |
| Entity ID | Định danh duy nhất của IdP hoặc SP, dùng để hai bên nhận ra nhau |
| ACS - Assertion Consumer Service | URL trên SP nhận phản hồi SAML do IdP gửi về |
Kiến trúc SAML 2.0: assertion, protocol, binding, profile
SAML 2.0 được tổ chức thành bốn lớp khái niệm, từ nội dung đến cách dùng:
- Assertion: phần nội dung bảo mật. Một assertion có thể chứa ba loại phát biểu: Authentication (người dùng đã xác thực bằng cách nào, lúc nào), Attribute (các thuộc tính của người dùng như email, nhóm, phòng ban) và Authorization decision (người dùng có được phép truy cập tài nguyên hay không).
- Protocol: các cặp yêu cầu/phản hồi, ví dụ AuthnRequest và Response (đăng nhập), LogoutRequest (đăng xuất), Artifact Resolution.
- Binding: cách ánh xạ thông điệp SAML lên giao thức truyền tải, phổ biến nhất là HTTP Redirect, HTTP POST, HTTP Artifact và SOAP.
- Profile: tổ hợp assertion, protocol và binding cho một tình huống cụ thể. Profile được dùng nhiều nhất là Web Browser SSO, ngoài ra còn Single Logout (SLO) và Enhanced Client or Proxy (ECP).
Trong luồng Web Browser SSO thông thường, AuthnRequest được gửi qua HTTP Redirect, còn phản hồi chứa assertion được gửi lại SP qua HTTP POST tới địa chỉ ACS.
Hai luồng đăng nhập: SP-initiated và IdP-initiated
| Tiêu chí | SP-initiated | IdP-initiated |
|---|---|---|
| Điểm bắt đầu | Người dùng vào ứng dụng (SP) trước | Người dùng đăng nhập cổng IdP rồi bấm vào ứng dụng |
| AuthnRequest | Có, SP gửi yêu cầu sang IdP | Không có, IdP gửi phản hồi chủ động (unsolicited) |
| Ràng buộc yêu cầu - phản hồi | Phản hồi gắn với yêu cầu SP đã tạo, dễ kiểm tra | Không có yêu cầu để đối chiếu |
| Rủi ro | Thấp hơn | Cao hơn: assertion injection, replay, CSRF |
| Phù hợp | Ứng dụng nhạy cảm về bảo mật, truy cập trực tiếp bằng URL | Cổng ứng dụng nội bộ tập trung (app launcher) |
Luồng 6 bước ở phần trên chính là SP-initiated. Trong thực tế, nhiều tổ chức dùng cả hai: IdP-initiated cho cổng ứng dụng nội bộ để người dùng bấm là vào, và SP-initiated cho các ứng dụng cần mức bảo mật cao hơn. Các biện pháp giảm rủi ro cho IdP-initiated (giới hạn thời gian hiệu lực assertion, kiểm tra audience, chống dùng lại assertion) chỉ làm giảm rủi ro chứ không đạt mức an toàn của SP-initiated, vì không khôi phục được cơ chế ràng buộc với yêu cầu ban đầu.
Assertion trông như thế nào?
Dưới đây là cấu trúc rút gọn của một assertion (giá trị minh họa):
xml<saml:Assertion Version="2.0" ID="_a1b2c3" IssueInstant="2026-10-28T03:00:00Z">
<saml:Issuer>https://idp.example.com/metadata</saml:Issuer>
<ds:Signature>...</ds:Signature>
<saml:Subject>
<saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">
user@example.com
</saml:NameID>
</saml:Subject>
<saml:Conditions NotBefore="2026-10-28T03:00:00Z" NotOnOrAfter="2026-10-28T03:05:00Z">
<saml:AudienceRestriction>
<saml:Audience>https://sp.example.com/metadata</saml:Audience>
</saml:AudienceRestriction>
</saml:Conditions>
<saml:AuthnStatement AuthnInstant="2026-10-28T02:59:50Z"/>
<saml:AttributeStatement>
<saml:Attribute Name="groups">
<saml:AttributeValue>Network-Admins</saml:AttributeValue>
</saml:Attribute>
</saml:AttributeStatement>
</saml:Assertion>
Các phần cần chú ý: Issuer (ai phát hành), Signature (chữ ký số), Subject/NameID (người dùng là ai), Conditions (khoảng thời gian hợp lệ và audience), AuthnStatement (đã xác thực khi nào) và AttributeStatement (thuộc tính như nhóm, vai trò).
So sánh SAML, OAuth 2.0 và OpenID Connect
| Tiêu chí | SAML 2.0 | OAuth 2.0 | OpenID Connect (OIDC) |
|---|---|---|---|
| Mục đích chính | Xác thực, SSO liên đoàn (federation) | Ủy quyền truy cập tài nguyên/API | Xác thực, xây trên OAuth 2.0 |
| Định dạng token | XML Assertion | Access token (tùy triển khai) | ID Token dạng JWT |
| Môi trường điển hình | SSO doanh nghiệp, ứng dụng web truyền thống | Cấp quyền cho ứng dụng/API | Ứng dụng web hiện đại, mobile, API |
| Độ phức tạp triển khai | Cao hơn do xử lý XML và chữ ký | Trung bình | Thường dễ hơn do dùng JSON/JWT |
Điểm cần nhớ: OAuth 2.0 không xác minh bạn là ai mà quản lý việc cấp quyền truy cập; SAML và OIDC mới là các chuẩn xác thực liên đoàn. Trong hệ thống doanh nghiệp, ba chuẩn này thường cùng tồn tại ở các lớp khác nhau: SAML cho SSO ứng dụng cũ, OAuth cho truy cập API, OIDC cho xác thực ứng dụng hiện đại.
Lưu ý bảo mật khi triển khai SAML
- Luôn kiểm tra chữ ký của assertion bằng chứng chỉ của IdP đã được cấu hình sẵn trên SP; không chấp nhận chứng chỉ lạ.
- Kiểm tra điều kiện:
NotBefore/NotOnOrAftercòn hiệu lực,Audienceđúng entity ID của SP,Destinationtrùng URL ACS. - Giới hạn thời gian hiệu lực của assertion ở mức ngắn, đồng bộ thời gian (NTP) giữa IdP và SP để tránh lỗi lệch giờ.
- Theo dõi hạn chứng chỉ ký của IdP: chứng chỉ hết hạn hoặc được xoay vòng mà SP chưa cập nhật là nguyên nhân gây lỗi đăng nhập hàng loạt.
- Ưu tiên SP-initiated cho ứng dụng nhạy cảm; chỉ bật IdP-initiated khi thực sự cần.
- Bật MFA tại IdP: vì mọi ứng dụng tin cậy IdP, tài khoản IdP bị lộ đồng nghĩa mọi ứng dụng bị ảnh hưởng.
- Khớp thuộc tính: tên thuộc tính username/group mà IdP gửi phải khớp chính xác với cấu hình trên SP, nếu không việc ánh xạ người dùng và nhóm sẽ thất bại.
SAML SSO trên thiết bị Fortinet
SAML được tích hợp sẵn trên FortiGate cho nhiều tình huống:
- Đăng nhập quản trị FortiGate: SAML được đưa vào làm phương thức xác thực quản trị từ FortiOS 6.2. FortiGate đóng vai trò SP, IdP có thể là Microsoft Entra ID, Okta, JumpCloud, ADFS hoặc FortiAuthenticator. Khi cấu hình cần nhập IdP entity ID, IdP single sign-on URL, và nhập chứng chỉ ký của IdP vào FortiGate dưới dạng Remote Certificate.
- SSL VPN: FortiGate SSL VPN hỗ trợ SSO theo hướng SP-initiated. Người dùng được ánh xạ vào nhóm SAML trên FortiGate dựa trên thuộc tính username và group mà IdP trả về.
- Captive portal Wi-Fi, IPsec dial-up với FortiClient: cũng có thể dùng SAML với IdP như Entra ID.
Ngoài SAML, FortiGate còn có các cơ chế SSO khác dành cho người dùng nội bộ mạng LAN, không dựa trên trình duyệt như SAML. Bạn có thể tham khảo FortiGate Single Sign-On (FSSO) và bài lab RSSO trên FortiGate với 802.1X trên Cisco 2960.
Để tìm hiểu các giải pháp xác thực và bảo mật liên quan, xem thêm bài Giải pháp bảo mật FortiGate UTM và SASE là gì.
Khi nào nên dùng SAML SSO?
- Tổ chức có nhiều ứng dụng web/SaaS và muốn quản lý danh tính tập trung tại một IdP (AD, Entra ID, Okta).
- Cần áp dụng MFA và chính sách truy cập đồng nhất cho mọi ứng dụng, đồng thời thu hồi quyền nhanh khi nhân sự nghỉ việc.
- Cần giảm số lượng mật khẩu người dùng phải nhớ, giảm tải cho bộ phận hỗ trợ IT vì quên mật khẩu.
- Cần đăng nhập quản trị thiết bị mạng bằng tài khoản doanh nghiệp thay cho tài khoản cục bộ.
Câu hỏi thường gặp (FAQ)
SAML SSO là gì? SAML SSO là cơ chế đăng nhập một lần dựa trên chuẩn SAML: người dùng xác thực tại nhà cung cấp danh tính (IdP), IdP gửi assertion XML đã ký cho ứng dụng (SP) để ứng dụng cho phép truy cập mà không cần nhập lại mật khẩu.
IdP và SP khác nhau thế nào? IdP là nơi lưu danh tính và xác thực người dùng, SP là ứng dụng hoặc thiết bị cung cấp dịch vụ và tin cậy IdP để quyết định cho truy cập.
SAML khác OAuth 2.0 ở điểm nào? SAML dùng để xác thực người dùng, còn OAuth 2.0 là khung ủy quyền cho phép ứng dụng truy cập tài nguyên thay mặt người dùng. OpenID Connect là lớp xác thực xây trên OAuth 2.0.
SP-initiated và IdP-initiated nên chọn loại nào? Ưu tiên SP-initiated vì có yêu cầu xác thực để đối chiếu với phản hồi, ít rủi ro hơn. IdP-initiated phù hợp cổng ứng dụng nội bộ tập trung nhưng cần thêm biện pháp giảm thiểu rủi ro.
Assertion SAML có mã hóa không? Assertion luôn cần được ký để SP xác minh nguồn gốc và tính toàn vẹn. Mã hóa assertion là tùy chọn bổ sung, thường dùng khi thông tin đi qua trình duyệt cần được giữ kín.
Vì sao đăng nhập SAML báo lỗi sau khi đổi chứng chỉ? Nguyên nhân thường gặp là chứng chỉ ký của IdP đã thay đổi nhưng SP vẫn giữ chứng chỉ cũ nên không xác thực được chữ ký. Cần nhập lại chứng chỉ mới của IdP vào SP.
FortiGate có hỗ trợ đăng nhập quản trị bằng SAML không? Có, từ FortiOS 6.2 FortiGate hỗ trợ SAML làm phương thức xác thực quản trị, với IdP như Entra ID, Okta, ADFS hoặc FortiAuthenticator.
Thông tin liên quan
- FortiGate Single Sign-On (FSSO)
- Lab RSSO trên FortiGate với 802.1X trên Cisco 2960
- Giải pháp bảo mật FortiGate UTM
- SASE là gì
- Cấu hình Guest WiFi với Cisco WLC và Cisco ISE