Đăng nhập một lần trên nhiều miền [đã đóng]


110

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

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

Tôi đã nghĩ đến việc chuyển sang đăng nhập một lần trên (SSO), để có thể loại bỏ sự phức tạp này. Tôi sẽ đánh giá cao bất kỳ ý tưởng nào về cách có thể đạt được điều này, vì tôi không có bất kỳ kinh nghiệm nào về vấn đề này.

Cảm ơn.

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


Điều này nghe có vẻ giống như một công việc đối với OpenID - nhưng chỉ cho phép các ID từ miền đăng nhập của bạn.
Neall

2
@Will Câu hỏi này có thể không dành cho trang web này trong mạng SE, nhưng chắc chắn mang tính xây dựng .
Binar Web

@BinarWeb Lý do đóng đã phát triển từ năm 2008. Hồi đó, đây là lựa chọn áp dụng nhất.

Câu trả lời:


91

Giải pháp SSO mà tôi đã triển khai ở đây hoạt động như sau:

  1. Có một miền chính, login.mydomain.com với tập lệnh master_login.php quản lý các thông tin đăng nhập.
  2. Mỗi miền 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 máy khách yêu cầu người dùng đăng nhập, 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 trang chủ, nó sẽ yêu cầu xác thực từ người dùng (tức là hiển thị trang đăng nhập). Sau khi người dùng được xác thực, nó sẽ tạo 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. Miền chính quay lại miền khách (client.mydomain.com/client_login.php) chuyển id phiên.
  6. Miền máy khách tạo một cookie lưu trữ id phiên từ miền 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 id phiên.

Ghi chú:

  • Id phiên là số nhận dạng toàn cầu duy nhất được tạo bằng thuật toán từ RFC 4122
  • Master_login.php sẽ chỉ chuyển hướng đến các miền trong danh sách trắng của nó
  • Máy chủ và máy khách 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

Đây có vẻ như là một giải pháp tốt. Bạn lưu trữ gì trong databse? Có phải (session_id, tên người dùng, hashed_password) không?
Jon M

3
Bạn xử lý thế nào trong trường hợp tên miền chính login.mydomain.com gặp sự cố? Không thể đăng nhập vào thời điểm đó?
jjxtra

3
Bất kỳ cơ quan nào tạo ra bất kỳ ví dụ mã hoặc một repo github?
Joshua F. Rountree,

Đây là điều mà gần như tất cả các giao thức SSO (ví dụ như SAML) chỉ định, nhưng với tính bảo mật cao hơn chống lại các cuộc tấn công phát lại, v.v.
cweiske

2
Điều gì sẽ xảy ra nếu họ không chia sẻ cơ sở dữ liệu người dùng? Mỗi ứng dụng web đối tác có cơ sở người dùng riêng. Làm thế nào để chúng ta gặp phải điều này?
kẹt lại dòng chảy vào

33

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


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

5
+1 Bạn [gần như] không bao giờ nên phát minh lại bánh xe bảo mật.
Mark E. Haase

13
OpenSSO đã chết và JOSSO và CAS là các giải pháp JAVA. Just a FYI
OneHoopyFrood

15

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

Các máy chủ này có thể chia sẻ cookie:

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

Nhưng những điều này không thể:

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

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


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 đó việc đăng nhập có thể diễn ra liền mạch.

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


2
không phải 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 truy cập vào các trang web đó lần đầu tiên cho phiên này?
HaBo
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.