2008-09-04 39 views
95

Công ty chúng tôi có nhiều tên miền được thiết lập với một trang web được lưu trữ trên mỗi tên miền. Tại thời điểm này, mỗi tên miền có xác thực riêng của mình được thực hiện thông qua cookie.Đăng nhập một lần trên nhiều tên miền

Khi ai đó đăng nhập vào một miền cần truy cập mọi thứ từ người khác, người dùng cần phải đăng nhập lại bằng thông tin đăng nhập khác trên trang web khác, nằm trên miền khác.

Tôi đã nghĩ đến việc chuyển sang một dấu hiệu đơn (SSO), để rắc rối này có thể bị loại bỏ. Tôi sẽ đánh giá cao bất kỳ ý tưởng về cách này có thể đạt được, như tôi không có bất kỳ kinh nghiệm trong lĩnh vực này.

Cảm ơn.

Chỉnh sửa: Trang web được kết hợp giữa internet (bên ngoài) và mạng nội bộ (được sử dụng nội bộ trong công ty).

+0

Điều này nghe giống như một công việc cho [OpenID] (http://openid.net/) - nhưng chỉ cho phép ID từ miền đăng nhập của bạn. – Neall

Trả lời

2

Nếu bạn sử dụng Active Directory, bạn có thể yêu cầu mỗi ứng dụng sử dụng AD để xác thực, khi đó, đăng nhập có thể liền mạch.

Nếu không, nếu các ứng dụng có thể nói chuyện với nhau đằng sau hậu trường, bạn có thể sử dụng sessionids và có một ứng dụng xử lý id ứng dụng phục vụ tất cả các ứng dụng khác của bạn.

+0

không phải là người dùng vẫn phải nhập tên người dùng và mật khẩu trên domain1.com và domain2.com và domain3.com khi anh ấy truy cập vào các trang web đó lần đầu tiên cho phiên này? – HaBo

14

Tên máy chủ khác nhau như thế nào?

Những host có thể chia sẻ các tập tin cookie:

  • mail.xyz.com
  • www.xyz.com
  • logon.xyz.com

Nhưng những không thể:

  • abc.com
  • xyz.com
  • www.tre.com

Trong trường hợp trước đây bạn có thể đập ra một giải pháp dựa trên cookie. Hãy suy nghĩ GUID và một bảng phiên cơ sở dữ liệu.

76

Giải pháp SSO mà tôi đã thực hiện ở đây hoạt động như sau:

  1. Có một master domain, login.mydomain.com với master_login.php kịch bản để quản lý các thông tin đăng nhập.
  2. Mỗi miền của khách hàng có tập lệnh client_login.php
  3. Tất cả các miền đều có cơ sở dữ liệu phiên người dùng được chia sẻ.
  4. Khi miền của khách hàng yêu cầu người dùng đăng nhập, tên miền sẽ chuyển hướng đến miền chính (login.mydomain.com/master_login.php). Nếu người dùng chưa đăng nhập vào master, nó yêu cầu xác thực từ người dùng (ví dụ: trang đăng nhập hiển thị). Sau khi người dùng được xác thực, nó tạo ra một phiên trong cơ sở dữ liệu. Nếu người dùng đã được xác thực, nó sẽ tra cứu id phiên của họ trong cơ sở dữ liệu.
  5. Tên miền chính quay lại miền ứng dụng khách (client.mydomain.com/client_login.php) chuyển id phiên.
  6. Miền ứng dụng tạo cookie lưu trữ id phiên từ chính. Máy khách có thể tìm ra người dùng đã đăng nhập bằng cách truy vấn cơ sở dữ liệu được chia sẻ bằng cách sử dụng id phiên.

Ghi chú:

  • Các phiên id là một định danh toàn cầu duy nhất được tạo với thuật toán từ RFC 4122
  • Các master_login.php sẽ chỉ chuyển hướng đến các lĩnh vực trong danh sách trắng
  • Các thầy và các khách hàng của mình có thể ở các miền cấp cao nhất khác nhau. Ví dụ. client1.abc.com, client2.xyz.com, login.mydomain.com
+0

Điều này trông giống như một giải pháp tốt grom. Những gì bạn lưu trữ trong databse? Có phải nó (session_id, username, hashed_password)? –

+1

Làm thế nào để bạn xử lý các trường hợp whare tên miền chính login.mydomain.com đi xuống? Là đăng nhập không thể vào thời điểm đó? – jjxtra

+3

Bất kỳ cơ thể nào tạo ra bất kỳ ví dụ mã nào hoặc repo github? –

30

Không phát minh lại bánh xe. Có một số gói SSO tên miền mở nguồn mở như JOSSO, OpenSSO, CAS, Shibboleth và các gói khác. Nếu bạn đang sử dụng Microsoft Technology trong suốt (IIS, AD), bạn có thể sử dụng liên kết microsoft (ADFS) thay thế.

+2

Tuyệt đối - Tôi đã thấy quá nhiều người cuộn giải pháp bảo mật của riêng họ chỉ để phát hiện ra rằng họ dễ bị phát lại, XSRF hoặc các cuộc tấn công khác –

+3

+1 Bạn nên [hầu như] không bao giờ phát minh lại bánh xe an toàn. –

+6

OpenSSO đã chết và JOSSO và CAS là các giải pháp JAVA. Chỉ là một FYI – OneHoopyFrood

Các vấn đề liên quan