Cách trở thành nhà cung cấp dịch vụ SAML


80

Công ty của tôi hiện đang phát triển một ứng dụng web Java. Một vài khách hàng của chúng tôi có máy chủ SAML nội bộ (nhà cung cấp danh tính?) Và đã yêu cầu chúng tôi tích hợp với họ. Vì vậy, gần đây tôi đã đọc về nó và chơi với OpenAM. Sau khoảng 3 ngày kể từ ngày này, tôi đã hiểu tổng quát về nó, nhưng vẫn còn một số lỗ hổng trong kiến ​​thức của tôi. Hy vọng của tôi là ai đó có thể giải tỏa điều này cho tôi.

Vì vậy, đây là cách tôi hình dung quy trình làm việc của một người dùng đăng nhập.

Hãy xác định máy chủ SAML của khách hàng là https://their.samlserver.com . Vì vậy, một người dùng đến với ứng dụng web của chúng tôi để nhận tài nguyên được bảo vệ. Giả sử URL đó là http://my.app.com/something .

Vì vậy, nếu tôi đúng, my.app.com là những gì SAML định nghĩa là Nhà cung cấp dịch vụ . Ứng dụng của chúng tôi nhận ra rằng người dùng này cần đăng nhập. Sau đó, chúng tôi trình bày một trang như thế này cho người dùng ...

<script>JQuery Script to auto submit this form on ready</script>
<form method="post" action="https://their.samlserver.com/Post/Servlet">
    <input type="hidden" name="SAMLRequest" value="someBase64Data" />
    <input type="submit" value="Submit" />
</form>

Và đó someBase64Datanên được base64mã hóa phiên bản này ...

<samlp:AuthnRequest
  xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
  xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
  ID="identifier_1"
  Version="2.0"
  IssueInstant="2004-12-05T09:21:59Z"
  AssertionConsumerServiceIndex="0">
 <saml:Issuer>http://my.app.com</saml:Issuer>
 <samlp:NameIDPolicy
   AllowCreate="true"
   Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient"/>
</samlp:AuthnRequest>

Vì vậy, vài câu hỏi đầu tiên của tôi.

Là gì ID giá trị giả được?

Và tại sao tôi có thể tuyên bố mình là Nhà phát hành ?

Nhà cung cấp danh tính có biết về tôi không? Có lẽ đây là Vòng tròn tin cậy mà tôi đã thấy trên OpenAM . Và nếu nó biết về tôi, làm thế nào nó biết về tôi và nó cần biết những gì?

Vì vậy, sau khi người dùng được chuyển tiếp trang đó, họ sẽ được đưa đến một trang do IDP https://their.samlserver.com cung cấp . Họ xác thực trên trang đó và IDP thực hiện điều kỳ diệu để xác thực xác thực và tra cứu người dùng. Sau khi xác thực thành công, IDP sẽ gửi lại một <samlp:Response>xác định tại đây .

Một vài câu hỏi nữa.

Đầu tiên, làm cách nào để <samlp:Response>quay lại ứng dụng web của tôi để tôi có thể kiểm tra nó?

Và tôi nên tìm kiếm điều gì trong phản hồi đó để xác nhận rằng nó đã thành công? Thất bại trông như thế nào?

Chúng tôi hiện đang sử dụng địa chỉ email (LDAP) để xác định người dùng, vì vậy có thể chúng tôi sẽ lấy địa chỉ đó từ phản hồi và sử dụng địa chỉ đó theo cách chúng tôi làm hiện nay. Còn điều gì khác mà tôi nên lưu tâm trong phản hồi đó không?

Vì vậy, bây giờ chúng tôi đã kiểm tra tính hợp lệ của phản hồi đó, chúng tôi có thể cấp cho người dùng một phiên như hiện tại. Nhưng khi họ muốn đăng xuất, có quy trình làm việc cho điều đó không? Tôi có phải thông báo cho IDP rằng người dùng đã rời đi không?

Và cuối cùng, có một vài chủ đề đã được xoay quanh trong bài đọc của tôi và tôi không chắc chúng phù hợp với quy trình làm việc này như thế nào. Họ là các mối tin cậy , Token , và hiện vật .

Cảm ơn mọi người đã giúp đỡ Tôi đã tìm thấy rất nhiều thông tin trong vài ngày qua, và có thể tôi có thể ghép chúng lại với nhau sau khi chơi nhiều hơn một chút. Nhưng tôi vẫn chưa tìm thấy bài viết quy trình làm việc "Đây là bài đăng" đơn giản. Có lẽ đó là bởi vì tôi sai về cách hoạt động của nó Có lẽ đó là bởi vì điều này không phổ biến. Nhưng tôi thực sự muốn đảm bảo rằng tôi đã nắm được quy trình làm việc để không bỏ lỡ một bước quan trọng nào đó quan trọng như xác thực người dùng.


3
Tôi đang gặp phải vấn đề tương tự ngay bây giờ (đang xem xét cách tạo nhà cung cấp dịch vụ SAML v2 được liên kết nhẹ tương tác với Ping Identity). Bạn có phiền bình luận về cách nó hoạt động cho bạn không? Bạn đã kết thúc việc sử dụng một chiếc mũ phớt hay viết mã của riêng bạn? Cảm ơn!
theglauber

1
Tôi đang có một môi trường tương tự. Tôi có một ứng dụng web dựa trên java đang chạy trên tomcat, bây giờ tôi phải thực hiện SSO bằng SAML. Tôi không biết gì về những công nghệ này ngoài kiến ​​thức lý thuyết. Ai có thể giúp tôi cấu hình từ đầu không?
Jerry

Câu trả lời:


46

Để trả lời các câu hỏi cụ thể của bạn:

1.) Giá trị "ID" phải là gì?

  • Đây phải là số nhận dạng duy nhất cho yêu cầu SAML. Đặc tả SAML 2.0 tuyên bố rằng nó thực sự cụ thể về cách thực hiện điều này, nhưng đưa ra các đề xuất sau:

Cơ chế mà thực thể hệ thống SAML đảm bảo rằng số nhận dạng là duy nhất được để cho việc triển khai. Trong trường hợp sử dụng kỹ thuật ngẫu nhiên hoặc giả ngẫu nhiên, xác suất của hai số nhận dạng được chọn ngẫu nhiên giống hệt nhau PHẢI nhỏ hơn hoặc bằng 2 ^ -128 và NÊN có độ dài nhỏ hơn hoặc bằng 2 ^ -160. Yêu cầu này CÓ THỂ được đáp ứng bằng cách mã hóa một giá trị được chọn ngẫu nhiên có độ dài từ 128 đến 160 bit.

2.) Làm thế nào IdP biết về bạn?

  • SP của bạn cần phải được đăng ký với IdP. Để thực hiện điều này, đặc tả SAML xác định một định dạng cho "Siêu dữ liệu SAML" cho IdP biết nơi nhận SAML của bạn, chứng chỉ của bạn là gì, thuộc tính bạn trao đổi, v.v. OpenAM có thể ra lệnh một số yêu cầu tối thiểu để định cấu hình SP đáng tin cậy. Điều này khác nhau ở mỗi sản phẩm.

3.) Câu trả lời đi đến đâu, và cần kiểm tra những gì?

  • Phản hồi sẽ chuyển đến URL Dịch vụ Người tiêu dùng Xác nhận (ACS) của bạn thường được xác định trong Siêu dữ liệu SAML mà bạn trao đổi từ SP của mình với IdP để thiết lập ban đầu. Khi nhận được Phản hồi SAML, bạn cần kiểm tra nhiều thứ - nhưng quan trọng nhất, mã Trạng thái SAML phải là "thành công", ID inResponseTo phải khớp với ID đã gửi của yêu cầu và bạn phải xác thực chữ ký điện tử trên Xác nhận. Vì vậy, bạn sẽ cần phải tin tưởng vào chứng chỉ xác minh công khai của IdP và có thể bạn cũng sẽ muốn thực hiện kiểm tra việc thu hồi.

4.) Điều gì về Đăng xuất?

  • SAML 2.0 cũng xác định cấu hình cho Đăng nhập một lần (SLO). Điều này sẽ không chỉ đăng xuất bạn khỏi SP mà còn cả IdP và có thể là bất kỳ SP nào khác mà bạn đã thiết lập phiên. Nó có luồng yêu cầu / phản hồi tương tự như Đăng nhập một lần (SSO), và do đó, những thứ tương tự để thiết lập và kiểm tra (mã trạng thái, chữ ký, v.v.).

Vì vậy, trong ngắn hạn - điều này có thể khá phức tạp để thực hiện từ đầu. Tốt nhất là sử dụng các thư viện và / hoặc sản phẩm đã thử & đúng như Ian gợi ý. Các công ty như của anh ấy đã đầu tư hàng trăm giờ thời gian của nhà phát triển để triển khai theo thông số kỹ thuật và kiểm tra khả năng tương tác với các nhà cung cấp khác.


2
Tại sao phải có ID trong yêu cầu saml. Tôi không hiểu.
Ashwin

1
Nó được yêu cầu như một phần của thông số lõi SAML 2.0. Xem docs.oasis-open.org/security/saml/v2.0/saml-core-2.0-os.pdf . AuthnRequest thuộc loại AuthnRequestType (phần 3.4.1), là phần mở rộng của RequestAbstractType (phần 3.2.1) có thuộc tính ID bắt buộc. Một trong những lợi ích chính đối với ID trong yêu cầu là do đó Phản hồi có thể tham chiếu nó để SP có thể ánh xạ cả hai với nhau để ngăn phát lại.
Scott T.

Bạn nói id được cấp để ngăn chặn tấn công phát lại. Nếu tôi đang sử dụng kết nối ssl / https giữa Nhà cung cấp dịch vụ và Nhà cung cấp dịch vụ ID, thì có thể ngăn chặn được cuộc tấn công phát lại không.
Ashwin

1
SSL / HTTPS giữa SP và IdP hơi vô nghĩa để ngăn chặn tấn công phát lại, vì các liên kết "kênh trước" (trình duyệt) thường được sử dụng.
Scott T.

@Ashwin - Id ở đó để khi bạn nhận lại phản hồi, nó có cùng id đó và bạn có thể biết rằng phản hồi mà bạn nhận được có liên quan đến yêu cầu của bạn, ngoài việc ngăn chặn phát lại, tôi hiểu rằng có rất nhiều dấu thời gian trong cả yêu cầu và phản hồi trong SAML và id chỉ khả thi cùng với ủy quyền trong một khoảng thời gian giới hạn.
Uncle Iroh

3

Nếu bạn chỉ đang cố gắng thiết lập một ứng dụng Java duy nhất làm Nhà cung cấp dịch vụ, bạn nên cân nhắc sử dụng Fedlet từ Oracle (độc lập) hoặc ForgeRock (đi kèm với OpenAM). ForgeRock Fedlet có một số vấn đề khi tương tác với Shibboleth 2.2.1 với tư cách là Nhà cung cấp danh tính, nhưng tôi thấy nó có phần đơn giản hơn để định cấu hình và nhiều thông tin hơn.

Mỗi hướng dẫn rõ ràng có trong README để giúp bạn triển khai. Sau khi Fedlet được định cấu hình và giao tiếp với IDP, trang thành công sẽ hiển thị cho bạn tất cả mã bạn cần để tích hợp SSO liên kết vào ứng dụng của mình. Nó thực hiện công việc nền là gửi và nhận AuthnRequests và phản hồi.

Câu trả lời của Scott phản hồi khá tốt cho các câu hỏi của bạn, nhưng tôi nghĩ rằng cố gắng viết mã của riêng bạn để tạo ra SAML là phát minh lại bánh xe. Fedlet được thiết kế chính xác với mục đích sử dụng này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.