Bagikan melalui


Menulis Klien SSPI Terautentikasi

Semua sesi klien/server RPC memerlukan pengikatan antara klien dan server. Untuk menambahkan keamanan ke aplikasi klien/server, program harus menggunakan pengikatan terautentikasi. Bagian ini menjelaskan proses pembuatan pengikatan terautentikasi antara klien dan server.

Untuk informasi terkait, lihat Prosedur yang Digunakan dengan Sebagian Besar Paket dan Protokol Keamanan dalam Kit Pengembangan Perangkat Lunak Platform (SDK).

Membuat Handel Pengikatan Sisi Klien

Untuk membuat sesi terautentikasi dengan program server, aplikasi klien harus memberikan informasi autentikasi dengan handel pengikatannya. Untuk menyiapkan handel pengikatan terautentikasi, klien memanggil fungsi RpcBindingSetAuthInfo atau RpcBindingSetAuthInfoEx . Kedua fungsi ini hampir identik. Satu-satunya perbedaan di antara mereka adalah bahwa klien dapat menentukan kualitas layanan dengan fungsi RpcBindingSetAuthInfoEx .

Fragmen kode berikut menunjukkan tampilan panggilan ke RpcBindingSetAuthInfo .

// This code fragment assumes that rpcBinding is a valid binding 
// handle between the client and the server. It also assumes that
// pAuthCredentials is a valid pointer to a data structure which
// contains the user's authentication credentials.

dwStatus = DsMakeSpn(
    "ldap",
    "ServerName.domain.com",
    NULL,
    0,
    NULL,
    &pcSpnLength,
    pszSpn);

//...

rpcStatus = RpcBindingSetAuthInfo(
    rpcBinding,                       // Valid binding handle
    pszSpn,                           // Principal name 
    RPC_C_AUTHN_LEVEL_PKT_INTEGRITY,  // Authentication level
    RPC_C_AUTHN_GSS_NEGOTIATE,        // Use Negotiate SSP
    NULL,                             // Authentication credentials <entity type="ndash"/> use current thread credentials
    RPC_C_AUTHZ_NAME);                // Authorization service

Setelah klien berhasil memanggil fungsi RpcBindingSetAuthInfo atau RpcBindingSetAuthInfoEx , pustaka run-time RPC secara otomatis mengautentikasi semua panggilan RPC pada pengikatan. Tingkat keamanan dan autentikasi yang dipilih klien hanya berlaku untuk handel pengikatan tersebut. Handel konteks yang berasal dari handel pengikatan akan menggunakan informasi keamanan yang sama, tetapi modifikasi berikutnya pada handel pengikatan tidak akan tercermin dalam handel konteks. Untuk informasi selengkapnya, lihat Handel Konteks.

Tingkat autentikasi tetap berlaku sampai klien memilih tingkat lain, atau sampai proses berakhir. Sebagian besar aplikasi tidak akan memerlukan perubahan tingkat keamanan. Klien dapat meminta handel pengikatan apa pun untuk mendapatkan informasi otorisasinya dengan memanggil RpcBindingInqAuthClient dan meneruskannya handel pengikatan.

Memberikan Kredensial Klien ke Server

Server menggunakan informasi pengikatan klien untuk menegakkan keamanan. Klien selalu melewati handel pengikatan sebagai parameter pertama dari panggilan prosedur jarak jauh. Namun, server tidak dapat menggunakan handel kecuali dinyatakan sebagai parameter pertama untuk prosedur jarak jauh baik dalam file IDL atau dalam file konfigurasi aplikasi server (ACF). Anda dapat memilih untuk mencantumkan handel pengikatan dalam file IDL, tetapi ini memaksa semua klien untuk mendeklarasikan dan memanipulasi handel pengikatan daripada menggunakan pengikatan otomatis atau implisit. Untuk informasi lebih lanjut, lihat File IDL dan ACF.

Metode lain adalah membiarkan handel pengikatan keluar dari file IDL dan menempatkan atribut explicit_handle ke ACF server. Dengan cara ini, klien dapat menggunakan jenis pengikatan yang paling cocok untuk aplikasi, sementara server menggunakan handel pengikatan seolah-olah dinyatakan secara eksplisit.

Proses mengekstrak kredensial klien dari handel pengikatan terjadi sebagai berikut:

  • Klien RPC memanggil RpcBindingSetAuthInfo dan menyertakan informasi autentikasi mereka sebagai bagian dari informasi pengikatan yang diteruskan ke server.
  • Biasanya, server memanggil RpcImpersonateClient untuk berperilaku seolah-olah itu adalah klien. Jika handel pengikatan tidak diautentikasi, panggilan gagal dengan RPC_S_NO_CONTEXT_AVAILABLE. Untuk mendapatkan nama pengguna klien, panggil RpcBindingInqAuthClient saat meniru, atau pada Windows XP atau versi Windows yang lebih baru, panggil RpcGetAuthorizationContextForClient untuk mendapatkan konteks otorisasi, lalu gunakan fungsi Authz untuk mengambil nama.
  • Server biasanya akan memanggil CreatePrivateObjectSecurity untuk membuat objek dengan ACL. Setelah ini selesai, kemudian pemeriksaan keamanan menjadi otomatis.