การลงชื่อเพียงครั้งเดียวในหลายโดเมน [ปิด]


110

บริษัท ของเรามีการตั้งค่าหลายโดเมนโดยมีเว็บไซต์เดียวที่โฮสต์บนแต่ละโดเมน ในขณะนี้แต่ละโดเมนมีการตรวจสอบสิทธิ์ของตนเองซึ่งทำผ่านคุกกี้

เมื่อมีผู้เข้าสู่ระบบโดเมนหนึ่งต้องการเข้าถึงสิ่งใด ๆ จากอีกโดเมนหนึ่งผู้ใช้จะต้องเข้าสู่ระบบอีกครั้งโดยใช้ข้อมูลประจำตัวที่แตกต่างกันในเว็บไซต์อื่นซึ่งอยู่บนโดเมนอื่น

ฉันกำลังคิดที่จะก้าวไปสู่การลงชื่อเพียงครั้งเดียวบน (SSO) เพื่อให้ความยุ่งยากนี้หมดไป ฉันจะขอบคุณความคิดใด ๆ เกี่ยวกับวิธีการนี้เนื่องจากฉันไม่มีประสบการณ์ในเรื่องนี้

ขอบคุณ.

แก้ไข: เว็บไซต์เป็นแบบผสมผสานระหว่างไซต์อินเทอร์เน็ต (ภายนอก) และอินทราเน็ต (ใช้ภายใน บริษัท )


ดูเหมือนจะเป็นงานสำหรับOpenIDแต่อนุญาตเฉพาะ ID จากโดเมนลงชื่อเข้าใช้ของคุณ
Neall

2
@Will คำถามนี้อาจจะไม่ได้สำหรับเว็บไซต์ในเครือข่าย SE แต่แน่นอนที่สร้างสรรค์
Binar Web

เหตุผลของ @BinarWeb Close มีการพัฒนามาตั้งแต่ปี 2008 ในตอนนั้นนี่เป็นทางเลือกที่เหมาะสมที่สุด

คำตอบ:


91

โซลูชัน SSO ที่ฉันใช้ที่นี่ทำงานได้ดังนี้:

  1. มีโดเมนหลักคือ login.mydomain.com ที่มีสคริปต์ master_login.php ที่จัดการล็อกอิน
  2. โดเมนไคลเอ็นต์แต่ละโดเมนมีสคริปต์ client_login.php
  3. โดเมนทั้งหมดมีฐานข้อมูลเซสชันผู้ใช้ที่แชร์
  4. เมื่อโดเมนไคลเอ็นต์ต้องการให้ผู้ใช้ล็อกอินระบบจะเปลี่ยนเส้นทางไปยังโดเมนหลัก (login.mydomain.com/master_login.php) หากผู้ใช้ไม่ได้ลงชื่อเข้าใช้มาสเตอร์จะร้องขอการพิสูจน์ตัวตนจากผู้ใช้ (เช่นแสดงหน้าล็อกอิน) หลังจากตรวจสอบผู้ใช้แล้วจะสร้างเซสชันในฐานข้อมูล หากผู้ใช้ได้รับการพิสูจน์ตัวตนแล้วจะค้นหารหัสเซสชันของตนในฐานข้อมูล
  5. โดเมนหลักส่งกลับไปยังโดเมนไคลเอนต์ (client.mydomain.com/client_login.php) ผ่านรหัสเซสชัน
  6. โดเมนไคลเอ็นต์สร้างคุกกี้ที่เก็บรหัสเซสชันจากต้นแบบ ไคลเอนต์สามารถค้นหาผู้ใช้ที่ล็อกอินได้โดยการสอบถามฐานข้อมูลที่ใช้ร่วมกันโดยใช้รหัสเซสชัน

หมายเหตุ:

  • รหัสเซสชันคือตัวระบุส่วนกลางเฉพาะที่สร้างขึ้นด้วยอัลกอริทึมจาก RFC 4122
  • master_login.php จะเปลี่ยนเส้นทางไปยังโดเมนในรายการที่อนุญาตเท่านั้น
  • หลักและไคลเอนต์สามารถอยู่ในโดเมนระดับบนสุดที่แตกต่างกัน เช่น. client1.abc.com, client2.xyz.com, login.mydomain.com

นี่ดูเหมือนเป็นทางออกที่ดี คุณเก็บอะไรไว้ในฐานข้อมูล? ใช่ (session_id, ชื่อผู้ใช้, hashed_password) หรือไม่
Jon M

3
คุณจะจัดการกับกรณีที่โดเมนหลัก login.mydomain.com ล่มได้อย่างไร เข้าสู่ระบบไม่ได้ในตอนนั้นหรือไม่?
jjxtra

3
มีเนื้อหาใดที่สร้างตัวอย่างโค้ดหรือ repo github หรือไม่?
Joshua F. Rountree

นี่คือสิ่งที่โปรโตคอล SSO เกือบทั้งหมด (เช่น SAML) ระบุ แต่มีความปลอดภัยมากขึ้นจากการโจมตีซ้ำและอื่น ๆ
cweiske

2
จะเกิดอะไรขึ้นถ้าพวกเขาไม่แชร์ฐานข้อมูลผู้ใช้ เว็บแอปของพันธมิตรแต่ละรายมีฐานผู้ใช้ของตนเอง เราเจอสิ่งนี้ได้อย่างไร?
Stuckedoverflow

33

อย่าประดิษฐ์ล้อใหม่ มีแพ็กเกจ SSO ข้ามโดเมนแบบโอเพนซอร์สจำนวนมากเช่น JOSSO, OpenSSO, CAS, Shibboleth และอื่น ๆ หากคุณใช้ Microsoft Technology ตลอด (IIS, AD) คุณสามารถใช้ microsoft federation (ADFS) แทนได้


4
แน่นอน - ฉันเคยเห็นคนจำนวนมากเกินไปที่จะใช้โซลูชันความปลอดภัยของตัวเองเพียงเพื่อที่จะพบว่าพวกเขาเสี่ยงต่อการเล่นซ้ำ XSRF หรือการโจมตีอื่น ๆ

5
+1 คุณไม่ควร [เกือบ] สร้างวงล้อความปลอดภัยขึ้นมาใหม่
Mark E.Haase

13
OpenSSO ตายแล้วและ JOSSO และ CAS เป็นโซลูชั่น JAVA Just an FYI
OneHoopyFrood

15

ชื่อโฮสต์ต่างกันอย่างไร?

โฮสต์เหล่านี้สามารถแบ่งปันคุกกี้:

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

แต่สิ่งเหล่านี้ไม่สามารถ:

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

ในกรณีก่อนหน้านี้คุณสามารถใช้โซลูชันที่ใช้คุกกี้ได้ คิด GUID และตารางเซสชันฐานข้อมูล


2

หากคุณใช้ Active Directory คุณสามารถให้แต่ละแอปใช้ AD สำหรับการตรวจสอบสิทธิ์การเข้าสู่ระบบก็จะราบรื่น

มิฉะนั้นหากแอปพลิเคชันสามารถพูดคุยกันเบื้องหลังได้คุณสามารถใช้ sessionids และมีการสร้าง id ที่จัดการแอปหนึ่งแอปที่ให้บริการแอปพลิเคชันอื่น ๆ ทั้งหมด


2
ผู้ใช้ยังไม่ต้องป้อนชื่อผู้ใช้และรหัสผ่านบน domain1.com และ domain2.com และ domain3.com เมื่อเข้าสู่ไซต์เหล่านั้นเป็นครั้งแรกในเซสชันนี้
HaBo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.