it-swarm-vi.com

Làm cách nào để thiết lập đăng nhập một lần cho nhiều tên miền?

Tôi đã thiết lập đăng nhập một lần cho hai trong số các trang web của chúng tôi nằm trên cùng một tên miền: a.domain.com và b.domain.com

Tôi đã làm điều đó thông qua cookie, nhưng chúng phụ thuộc vào tên miền. Và - như được viết trong Sách vĩ đại - bây giờ nhu cầu đăng nhập một lần trên các tên miền khác nhau đã tăng lên cái đầu xấu xí của nó :) Tôi chắc chắn 99% tôi có thể quên sử dụng OpenId (họ không thích các dịch vụ bên ngoài Ở đây, tôi thậm chí không thể khiến họ chấp nhận reCaptcha )

Tôi muốn có thể xác định ai đó trên các trang web khác nhau (a.domain.com, b.anotherdomain.com, v.v.). Các cách được đề xuất để thiết lập/quản lý đăng nhập một lần trên nhiều tên miền là gì? Bất kỳ mối quan tâm bảo mật cụ thể nào tôi nên biết trước khi soạn thảo một đề xuất?

21
samy

Cách thức đăng nhập một lần đã được triển khai cho Stack Exchange Network rất thú vị. Nó sử dụng HTML 5 Lưu trữ cục bộ . Tùy thuộc vào sự hỗ trợ của trình duyệt mà bạn yêu cầu, bạn có thể sử dụng một phương pháp tương tự.

Bạn có thể kiểm tra bài đăng trên blog stackoverflow Đăng nhập mạng tự động toàn cầ để biết thêm chi tiết.

16
Mark Davidson

Bạn không phải sử dụng dịch vụ bên ngoài cho OpenId. Bạn có thể Lưu trữ máy chủ OpenId trong nội bộ và sử dụng nó cho SSO của bạn. Điều này sẽ cho phép bạn tận dụng mã nguồn mở và tất cả các công việc đã làm cho OpenId an toàn.

PS: OpenId có thể được sử dụng để có một danh tính duy nhất được sử dụng bởi nhiều trang web nhưng bạn vẫn phải đăng nhập "thủ công" trên mỗi tên miền.

5
Olivier Lalonde

Hai giao thức tốt cho việc này là OAuth (http://en.wikipedia.org/wiki/OAuth) và SAML. Bạn có thể chạy trang web "nhà cung cấp nhận dạng" của riêng mình, sử dụng OpenID hoặc xác thực khác cách tiếp cận.

5
nealmcb

Có lẽ ADFSv2 (Bản tải xuống miễn phí cho Windows 2008R2) sẽ giúp bạn với cookie tên miền phổ biến. Đây là một đoạn trích của web.config nằm trong C:\inetpub\adfs\ls mà bạn sẽ cần phải cấu hình để đạt được hiệu quả mong muốn.

  <!--
    Common domain cookie. A common domain cookie stores a list of recently visited Claims Providers 
    (also called Identity Providers), as described in Section 4.3.1 of Profiles for the OASIS Security 
    Assertion Markup Language (SAML) V2.0. It is recommended that you enable common domain cookies by 
    including the <commonDomainCookie> element in the web.config file.

      1.The writer attribute of the <commonDomainCookie> element specifies the address of the writer 
      service that a Claims Provider uses to set the common domain cookie once it has authenticated a user.
      This address should be a valid URL.
      2.The reader attribute of the the <commonDomainCookie> element specifies the address of the reader
      service that a claims-aware service (also called a Service Provider) uses to get the list of Claims
      Providers that it should present to the user. This address should be a valid URL.

      The following configuration enables the use of common domain cookies and specifies writer and reader 
      services as described previously. 

      A common Domain Cookie is named "_saml_idp" in 4.3.1 http://docs.oasis-open.org/security/saml/v2.0/saml-profiles-2.0-os.pdf
      Space delimited URI encoded

      RULES:
      Must be secure
      Must have path = /
      Must be leading period as in .domain.com 
      Can be session or persistant
      All providers should be configured similarly
      TODO-->
    <commonDomainCookie writer="" reader="" />
2
goodguys_activate

Rất nhiều câu trả lời tốt ở đây.
[.__.] Đây là một số giải pháp tốt:

  • OpenId
  • OAuth
  • SAML
  • QUẢNG CÁO
  • Lưu trữ cục bộ

Mặc dù tôi không nghĩ bất kỳ điều nào trong số này thực sự tầm thường để thực hiện, mà không tìm hiểu thêm một chút về chúng.

Tốt hơn hết là sẽ triển khai một sản phẩm SSO web phù hợp - mặc dù có vẻ như câu hỏi của bạn không phải là một lựa chọn (mặc dù tôi sẽ khuyên bạn nên xem xét lại và cố gắng thuyết phục những người cấp cao của bạn).

Một giải pháp khá đơn giản mà tôi đã thấy và trên thực tế, một số sản phẩm SSO trên web cũng sử dụng thủ thuật này (lưu ý rằng tôi không nhất thiết phải đề xuất phương pháp này trong mọi tình huống, xem bên dưới):
[.___.] Có tên miền "xác thực" thứ ba phát hành "cookie nhận dạng" (sau khi xác thực người dùng). Trang web trên các tên miền khác có thể gửi yêu cầu POST đơn giản đến miền xác thực, tất nhiên sẽ bao gồm cookie của người dùng cho tên miền đó . Về cơ bản, phản hồi được trả về sẽ cho biết tên miền ban đầu, liệu người dùng có được xác thực hay không và nếu cần danh tính của anh ta là gì.
[.__.] Nếu người dùng chưa được xác thực - anh ta sẽ được chuyển hướng đến một trang trên miền xác thực để gửi mật khẩu của mình, v.v.

Mặc dù điều này khá đơn giản để thiết lập, lưu ý rằng có một số thách thức xung quanh làm cho nó thực sự an toàn.
[.___.] Ví dụ, như được xác định, bất kỳ trang web có thể truy xuất danh tính của bạn. Ngoài ra, trang web dựa trên có thể bị "lừa" bằng cách sửa đổi phản hồi trả về.
[.__.] Tất nhiên, cách đơn giản nhất để giải quyết những vấn đề này là - bạn đoán nó - SAML/OpenId/etc.

1
AviD

Tôi vừa đăng ký, nhưng thật ngạc nhiên khi bạn không tìm thấy câu trả lời ở nơi khác. Như bạn đã phát hiện ra, bạn không thể chuyển mã xác thực thay thế bằng cookie.

Bạn đã không cung cấp bất kỳ chi tiết nào về cách xác thực cho trang web hiện tại của bạn cũng như các công cụ bạn có sẵn để lập trình trang web. Nhưng tôi sẽ cho rằng cơ chế xác thực được viết bằng ngôn ngữ chạy trên máy chủ web và sử dụng cookie để theo dõi phiên.

Trong trường hợp đó, bạn đã có mã trên mỗi url yêu cầu xác thực để kiểm tra xem phiên đã được xác thực chưa, rồi thực hiện hành động thích hợp - hành động yêu cầu hoặc chuyển hướng đến trang đăng nhập. Tất cả những gì bạn cần làm là đối phó với kịch bản không có phiên xác thực và có một biến được mã hóa được truyền trong URL (nghĩa là dưới dạng GET). Bạn giải mã giá trị, kiểm tra giá trị của nó và tạo một phiên tại thời điểm này. Sau đó, trên trang đăng nhập của bạn, sau khi đăng nhập thành công, bạn chuyển hướng, nối thêm cặp khóa/giá trị phù hợp vào URL.

Đó là một tổng quan ngắn gọn - có một số điều chỉnh bạn cần suy nghĩ (ví dụ: bạn có muốn cùng một dữ liệu phiên được chia sẻ trên tất cả các trang web không, bạn có muốn buộc lại phiên cho các phiên khác nhau để đảm bảo rằng nó không hết hạn phía máy chủ) và bạn cũng cần suy nghĩ về cách bạn ngăn chặn các cuộc tấn công phát lại (ví dụ: bao gồm a TTL trong tải trọng được mã hóa, bao gồm một thách thức được tạo ngẫu nhiên, nhưng hãy cẩn thận khi sử dụng địa chỉ IP của máy khách).

Vì bạn chỉ mã hóa/giải mã phía máy chủ, mã hóa đối xứng là đủ.

0
symcbean