Saya sedang mengerjakan API untuk layanan REST yang akan saya produksi dan konsumsi. Saya telah menghabiskan beberapa hari terakhir mencoba mencari cara untuk menangani otentikasi dengan baik, dan berpikir saya akhirnya menemukan sesuatu.
Saya datang dengan ini berdasarkan fakta-fakta berikut tentang tumpukan aplikasi:
- Klien & Server berada di .NET4 (Bagian klien dalam Profil Klien)
- Server terpapar menggunakan WCF REST
- Saya benar-benar tidak ingin menyimpan nama pengguna dan kata sandi di memori dalam aplikasi
Dari 3, saya ingin menggunakan bentuk otentikasi token, sehingga setelah kredensial diverifikasi oleh server, klien mendapat token kembali untuk digunakan sepanjang sisa aplikasi (ini akan memungkinkan saya untuk melakukan hal-hal lain, seperti mengatur waktu pengguna, dapat memindahkan pengguna dengan mulus antara versi web dan desktop, dll). Setelah mencari tahu cara membuat panggilan ulang dan mengutak-atik, saya telah datang dengan yang berikut:
- Sebelum klien mencoba untuk mengotentikasi, itu menghasilkan pasangan kunci Diffie-Hellman menggunakan
ECDiffieHellmanCng
kelas. - Ini mengirimkan bagian publik dari pasangan kunci melalui kawat bersama dengan nama pengguna dan kata sandi (Tentu saja HTTPS).
- Server mengautentikasi kombinasi nama pengguna / kata sandi, jika berhasil, ia akan melakukan yang berikut:
- Membuat token sesi unik
- Menghasilkan pasangan kunci DH sendiri, dan menghitung rahasia bersama dari kunci publik yang disediakan oleh klien
- Membuat catatan dari token sesi, rahasia bersama, pengguna, dan waktu "aksi terakhir" (digunakan untuk jendela kedaluwarsa bergulir) dalam database-nya
- Mengembalikan token sesi, kunci DH publiknya, dan pesan keberhasilan otentikasi
- Klien mengambil kunci DH dari respons, menghitung rahasia bersama, dan menyimpan token dan rahasia dalam memori.
Sejak saat ini, kombinasi token / rahasia sesi berfungsi seperti kebanyakan REST API lainnya, dengan permintaan yang diambil sidik jari dan cap waktu, dan kemudian menghasilkan semacam HMAC. Setiap kali klien melakukan tindakan terhadap server, itu memeriksa token / pasangan rahasia, dan memungkinkan tindakan jika valid dan tidak kedaluwarsa, dan memperbarui catatan tindakan terakhir dalam sesi.
Saya tidak melihat kekurangan yang jelas, dan mungkin terlalu banyak direkayasa untuk ini, tetapi saya perlu belajar bagaimana melakukan ini di beberapa titik. HMAC mencegah serangan replay, negosiasi DH membantu mencegah serangan MITM (Saya tidak bisa memikirkan serangan yang bisa dilakukan dari atas kepala saya antara HMAC / DH).
Adakah lubang yang bisa ditusuk orang dalam hal ini?
sumber
Jawaban:
Daripada membuat sendiri, Anda harus mempertimbangkan membaca API OpenAM dan meminjamnya.
http://forgerock.com/openam.html
OpenAM Wiki sangat membantu
https://wikis.forgerock.org/confluence/display/openam/Home
Anda tidak perlu menggunakan komponennya. Tetapi jika Anda menggunakan API mereka, Anda akan menemukan bahwa hidup Anda akan lebih sederhana dalam jangka panjang.
sumber
Saya setuju 100% dengan @ S.Lott bahwa Anda tidak ingin roll sendiri. Saya sarankan mencari alternatif lain: Layanan Kontrol Akses Windows Azure (ACS). ACS membutuhkan biaya, tetapi sangat murah (10.000 transaksi untuk $ 0,01) dan banyak infrastruktur yang ditangani. WIF dimanfaatkan pada klien.
Ini juga merupakan solusi berbasis standar / klaim - yang merupakan hal yang paling disukai. Lihat artikel ini tentang menggunakan WCF dan REST dan ACS bersama-sama .
Jika Anda memikirkan masa depan, ini juga merupakan mekanisme yang dapat tumbuh bersama Anda - karena Anda memiliki aplikasi seluler di luar firewall, mitra, dan sebagainya. Bahkan jika Anda tidak ingin menggunakannya karena itu menambah ketergantungan di luar firewall Anda, Anda mungkin ingin memeriksanya untuk gagasan. Sangat licin.
Semoga berhasil! -Tagihan
sumber