Mengambil alih identitas layanan untuk autentikasi
Biasanya, Anda tidak perlu mengatur identitas pada layanan karena pemilihan jenis mandat klien menentukan jenis identitas yang terekspos dalam metadata layanan. Misalnya, kode konfigurasi berikut menggunakan elemen <wsHttpBinding> dan mengatur atribut clientCredentialType
ke Windows.
Fragmen Web Services Description Language (WSDL) berikut menunjukkan identitas untuk titik akhir yang ditentukan sebelumnya. Dalam contoh ini, layanan berjalan sebagai layanan yang dihost sendiri di bawah akun pengguna tertentu (username@contoso.com
) dan oleh karena itu identitas nama prinsipal pengguna (UPN) berisi nama akun. UPN juga dikenal sebagai nama masuk pengguna di domain Windows.
Untuk aplikasi sampel yang menunjukkan pengaturan identitas, lihat Sampel Identitas Layanan. Untuk informasi selengkapnya tentang identitas layanan, lihat Identitas dan Autentikasi Layanan.
Autentikasi dan Identitas Kerberos
Secara default, ketika layanan dikonfigurasi untuk menggunakan mandat Windows, sebuah elemen<identitas> yang berisi elemen <userPrincipalName> atau <servicePrincipalName> dihasilkan di WSDL. Jika layanan berjalan di bawah akun LocalSystem
, LocalService
, atau NetworkService
, nama prinsipal layanan (SPN) dihasilkan secara default dalam bentuk host/
<nama host> karena akun tersebut memiliki akses ke data SPN komputer. Jika layanan berjalan di bawah akun yang berbeda, Windows Communication Foundation (WCF) menghasilkan UPN dalam formulir <nama pengguna>@<domainName>
. Ini terjadi karena autentikasi Kerberos mengharuskan UPN atau SPN diberikan kepada klien untuk mengautentikasi layanan.
Anda juga dapat menggunakan alat Setspn untuk mendaftarkan SPN tambahan dengan akun layanan di domain. Anda kemudian dapat menggunakan SPN sebagai identitas layanan. Untuk informasi selengkapnya tentang alat ini, lihat Gambaran Umum Setspn.
Catatan
Untuk menggunakan jenis mandat Windows tanpa negosiasi, akun pengguna layanan harus memiliki akses ke SPN yang terdaftar di domain Direktori Aktif. Anda dapat melakukannya dengan salah satu cara berikut:
Gunakan akun NetworkService atau LocalSystem untuk menjalankan layanan Anda. Karena akun tersebut memiliki akses ke SPN mesin yang ditetapkan ketika mesin bergabung dengan domain Direktori Aktif, WCF secara otomatis menghasilkan elemen SPN yang tepat di dalam titik akhir layanan dalam metadata layanan (WSDL).
Gunakan akun domain Active Directory arbitrer untuk menjalankan layanan Anda. Dalam hal ini, buat SPN untuk akun domain tersebut, yang dapat Anda lakukan dengan menggunakan alat utilitas Setspn.exe. Setelah Anda membuat SPN untuk akun layanan, konfigurasikan WCF untuk menerbitkan SPN tersebut ke klien layanan melalui metadatanya (WSDL). Ini dilakukan dengan mengatur identitas titik akhir untuk titik akhir yang diekspos, baik melalui file atau kode konfigurasi aplikasi.
Untuk informasi selengkapnya tentang SPN, protokol Kerberos, Active Directory Domain Services, lihat Suplemen Teknis Kerberos untuk Windows.
Ketika SPN atau UPN Sama dengan String Kosong
Jika Anda mengatur SPN atau UPN sama dengan string kosong, sejumlah hal berbeda terjadi, tergantung pada tingkat keamanan dan mode autentikasi yang digunakan:
Jika Anda menggunakan keamanan tingkat transportasi, autentikasi NT LanMan (NTLM) dipilih.
Jika Anda menggunakan keamanan tingkat pesan, autentikasi mungkin gagal, tergantung pada mode autentikasi:
Jika Anda menggunakan mode
spnego
dan atributAllowNtlm
diatur kefalse
, autentikasi gagal.Jika Anda menggunakan mode
spnego
dan atributAllowNtlm
diatur ketrue
, autentikasi gagal jika UPN kosong tetapi berhasil jika SPN kosong.Jika Anda menggunakan Kerberos direct (juga dikenal sebagai "one-shot"), autentikasi gagal.
Menggunakan Elemen <identitas> dalam Konfigurasi
Jika Anda mengubah jenis mandat klien dalam pengikatan yang sebelumnya ditunjukkan ke Certificate
, maka WSDL yang dibuat berisi sertifikat X.509 serial Base64 untuk nilai identitas seperti yang ditunjukkan dalam kode berikut. Ini adalah default untuk semua jenis mandat klien selain Windows.
Anda dapat mengubah nilai identitas layanan default atau mengubah jenis identitas dengan menggunakan elemen <identity>
dalam konfigurasi atau dengan mengatur identitas dalam kode. Kode konfigurasi berikut menetapkan identitas sistem nama domain (DNS) dengan nilai contoso.com
.
Mengatur Identitas Secara Terprogram
Layanan Anda tidak harus secara eksplisit menentukan identitas, karena WCF otomatis menentukannya. Namun, WCF memungkinkan Anda menentukan identitas pada titik akhir, jika perlu. Kode berikut menambahkan titik akhir layanan baru dengan identitas DNS tertentu.
ServiceEndpoint ep = myServiceHost.AddServiceEndpoint(
typeof(ICalculator),
new WSHttpBinding(),
String.Empty);
EndpointAddress myEndpointAdd = new EndpointAddress(new Uri("http://localhost:8088/calc"),
EndpointIdentity.CreateDnsIdentity("contoso.com"));
ep.Address = myEndpointAdd;
Dim ep As ServiceEndpoint = myServiceHost.AddServiceEndpoint(GetType(ICalculator), New WSHttpBinding(), String.Empty)
Dim myEndpointAdd As New EndpointAddress(New Uri("http://localhost:8088/calc"), EndpointIdentity.CreateDnsIdentity("contoso.com"))
ep.Address = myEndpointAdd