Sistem Masuk Tunggal di beberapa domain [ditutup]

110

Perusahaan kami memiliki beberapa domain yang disiapkan dengan satu situs web yang dihosting di setiap domain. Saat ini, setiap domain memiliki autentikasi sendiri yang dilakukan melalui cookie.

Ketika seseorang masuk ke satu domain perlu mengakses apa pun dari yang lain, pengguna perlu masuk lagi menggunakan kredensial yang berbeda di situs web lain, yang terletak di domain lain.

Saya berpikir untuk beralih ke single sign on (SSO), sehingga kerumitan ini bisa dihilangkan. Saya sangat menghargai ide tentang bagaimana hal ini dapat dicapai, karena saya tidak memiliki pengalaman apapun dalam hal ini.

Terima kasih.

Edit: Situs web adalah campuran dari situs internet (eksternal) dan intranet (digunakan internal dalam perusahaan).

Pascal
sumber
Ini terdengar seperti pekerjaan untuk OpenID - tetapi hanya mengizinkan ID dari domain masuk Anda.
Neall
2
@Will Pertanyaan ini mungkin bukan untuk situs web ini di jaringan SE, tetapi jelas konstruktif .
Binar Web
@BinarWeb Alasan tutup telah berkembang sejak 2008. Saat itu, ini adalah pilihan yang paling dapat diterapkan.

Jawaban:

91

Solusi SSO yang saya terapkan di sini berfungsi sebagai berikut:

  1. Ada domain master, login.mydomain.com dengan skrip master_login.php yang mengatur login.
  2. Setiap domain klien memiliki skrip client_login.php
  3. Semua domain memiliki database sesi pengguna bersama.
  4. Ketika domain klien mengharuskan pengguna untuk masuk, itu dialihkan ke domain master (login.mydomain.com/master_login.php). Jika pengguna belum masuk ke master itu meminta otentikasi dari pengguna (mis. Menampilkan halaman login). Setelah pengguna diautentikasi, itu membuat sesi dalam database. Jika pengguna sudah diautentikasi, ia mencari id sesi mereka di database.
  5. Domain master kembali ke domain klien (client.mydomain.com/client_login.php) lewat id sesi.
  6. Domain klien membuat cookie yang menyimpan id sesi dari master. Klien dapat mengetahui pengguna yang masuk dengan menanyakan database bersama menggunakan id sesi.

Catatan:

  • ID sesi adalah pengenal global unik yang dibuat dengan algoritme dari RFC 4122
  • Master_login.php hanya akan dialihkan ke domain dalam daftar putihnya
  • Master dan klien dapat berada di domain level teratas yang berbeda. Misalnya. klien1.abc.com, klien2.xyz.com, login.mydomain.com
grom
sumber
Ini terlihat seperti solusi yang bagus. Apa yang Anda simpan di databse? Apakah itu (session_id, username, hashed_password)?
Jon M
3
Bagaimana Anda menangani kasus di mana domain master login.mydomain.com turun? Apakah masuk tidak mungkin pada saat itu?
jjxtra
3
Ada badan yang menghasilkan contoh kode atau repo github?
Joshua F. Rountree
Ini adalah apa yang hampir semua protokol SSO (misalnya SAML) tentukan, tetapi dengan keamanan yang lebih tinggi terhadap serangan replay dan sebagainya.
cweiske
2
Bagaimana jika mereka tidak berbagi database pengguna? Setiap aplikasi web mitra memiliki basis penggunanya sendiri. Bagaimana kita menghadapi ini?
stuckedoverflow
33

Jangan menemukan kembali roda. Ada sejumlah paket SSO lintas domain open source seperti JOSSO, OpenSSO, CAS, Shibboleth, dan lainnya. Jika Anda menggunakan Teknologi Microsoft di seluruh (IIS, AD), Anda dapat menggunakan federasi microsoft (ADFS) sebagai gantinya.

Markc
sumber
4
Benar-benar - Saya telah melihat terlalu banyak orang menggulirkan solusi keamanan mereka sendiri hanya untuk menemukan bahwa mereka rentan terhadap replay, XSRF atau serangan lainnya
5
+1 Anda seharusnya [hampir] tidak pernah menemukan kembali roda keamanan.
Mark E. Haase
13
OpenSSO sudah mati dan JOSSO dan CAS adalah solusi JAVA. Hanya FYI
OneHoopyFrood
15

Seberapa berbedakah nama host?

Host berikut dapat membagikan cookie:

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

Tapi ini tidak bisa:

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

Dalam kasus sebelumnya, Anda dapat membuat solusi berbasis cookie. Pikirkan GUID dan tabel sesi database.

jason saldo
sumber
2

Jika Anda menggunakan Active Directory, Anda dapat meminta setiap aplikasi menggunakan AD untuk autentikasi, login dapat berjalan lancar.

Jika tidak, jika aplikasi dapat berbicara satu sama lain di belakang layar, Anda dapat menggunakan sessionid dan memiliki satu aplikasi yang menangani pembuatan id yang melayani semua aplikasi Anda yang lain.

Mike
sumber
2
Bukankah pengguna masih harus memasukkan nama pengguna dan kata sandi di domain1.com dan domain2.com dan domain3.com ketika dia membuka situs tersebut untuk pertama kalinya untuk sesi ini?
HaBo