Bagikan melalui


Meniru Klien

Sampel Tiruan menunjukkan cara meniru aplikasi penelepon di layanan sehingga layanan dapat mengakses sumber daya sistem atas nama pemanggil.

Ini didasarkan pada sampel Host Mandiri. File konfigurasi layanan dan klien sama dengan sampel Host Mandiri.

Catatan

Prosedur penyiapan dan petunjuk pembuatan untuk sampel ini terdapat di akhir topik ini.

Kode layanan telah dimodifikasi sehingga metode Add pada layanan meniru pemanggil menggunakan seperti OperationBehaviorAttribute yang ditunjukkan dalam kode sampel berikut.

[OperationBehavior(Impersonation = ImpersonationOption.Required)]
public double Add(double n1, double n2)
{
    double result = n1 + n2;
    Console.WriteLine("Received Add({0},{1})", n1, n2);
    Console.WriteLine("Return: {0}", result);
    DisplayIdentityInformation();
    return result;
}

Akibatnya, konteks keamanan utas yang dieksekusi dialihkan untuk meniru pemanggil sebelum memasukkan metode Add dan kembali keluar dari metode.

Metode DisplayIdentityInformation yang ditunjukkan dalam kode sampel berikut adalah fungsi utilitas yang menampilkan identitas pemanggil.

static void DisplayIdentityInformation()
{
    Console.WriteLine("\t\tThread Identity            :{0}",
         WindowsIdentity.GetCurrent().Name);
    Console.WriteLine("\t\tThread Identity level  :{0}",
         WindowsIdentity.GetCurrent().ImpersonationLevel);
    Console.WriteLine("\t\thToken                     :{0}",
         WindowsIdentity.GetCurrent().Token.ToString());
    return;
}

Metode Subtract pada layanan meniru pemanggil menggunakan panggilan imperatif seperti yang ditunjukkan dalam kode sampel berikut.

public double Subtract(double n1, double n2)
{
    double result = n1 - n2;
    Console.WriteLine("Received Subtract({0},{1})", n1, n2);
    Console.WriteLine("Return: {0}", result);
    Console.WriteLine("Before impersonating");
    DisplayIdentityInformation();

    if (ServiceSecurityContext.Current.WindowsIdentity.ImpersonationLevel == TokenImpersonationLevel.Impersonation ||
        ServiceSecurityContext.Current.WindowsIdentity.ImpersonationLevel == TokenImpersonationLevel.Delegation)
    {
        // Impersonate.
        using (ServiceSecurityContext.Current.WindowsIdentity.Impersonate())
        {
            // Make a system call in the caller's context and ACLs
            // on the system resource are enforced in the caller's context.
            Console.WriteLine("Impersonating the caller imperatively");
            DisplayIdentityInformation();
        }
    }
    else
    {
        Console.WriteLine("ImpersonationLevel is not high enough to perform this operation.");
    }

    Console.WriteLine("After reverting");
    DisplayIdentityInformation();
    return result;
}

Perhatikan bahwa dalam hal ini pemanggil tidak ditiru untuk seluruh panggilan tetapi hanya ditiru untuk sebagian panggilan. Secara umum, meniru untuk cakupan terkecil lebih disukai untuk meniru untuk seluruh operasi.

Metode lain tidak meniru pemanggil.

Kode klien telah dimodifikasi untuk mengatur tingkat peniruan ke Impersonation. Klien menentukan tingkat peniruan identitas yang akan digunakan oleh layanan, dengan menggunakan enumerasi TokenImpersonationLevel. Enumerasi mendukung nilai berikut: None, Anonymous, Identification, Impersonation dan Delegation. Untuk melakukan pemeriksaan akses saat mengakses sumber daya sistem pada komputer lokal yang dilindungi menggunakan ACL Windows, tingkat peniruan harus diatur ke Impersonation, seperti yang ditunjukkan dalam kode sampel berikut.

// Create a client with given client endpoint configuration
CalculatorClient client = new CalculatorClient();

client.ClientCredentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Impersonation;

Saat Anda menjalankan sampel, permintaan dan respons operasi ditampilkan di jendela konsol layanan dan klien. Tekan ENTER di setiap jendela konsol untuk mematikan layanan dan klien.

Catatan

Layanan harus berjalan di bawah akun administratif atau akun yang dijalankannya harus diberikan hak untuk mendaftarkan URI http://localhost:8000/ServiceModelSamples dengan lapisan HTTP. Hak tersebut dapat diberikan dengan menyiapkan Reservasi Namespace menggunakan alat Httpcfg.exe.

Catatan

Pada komputer yang menjalankan Windows Server 2003, peniruan identitas hanya didukung jika aplikasi Host.exe memiliki hak istimewa Peniruan. (Secara default, hanya administrator yang memiliki izin ini.) Untuk menambahkan hak istimewa ini ke akun yang dijalankan layanan, buka Alat Administratif, buka Kebijakan Keamanan Lokal, buka Kebijakan Lokal, klik Penetapan Hak Pengguna, dan pilih Tiru Klien setelah Autentikasi dan klik dua kali Properti untuk menambahkan pengguna atau grup.

Untuk menyiapkan, membangun, dan menjalankan sampel

  1. Pastikan Anda telah melakukan Prosedur Penyiapan Satu Kali untuk Sampel Windows Communication Foundation.

  2. Untuk membangun solusi edisi C# atau Visual Basic .NET, ikuti petunjuknya di Membangun Sampel WCF.

  3. Untuk menjalankan sampel dalam konfigurasi satu atau lintas komputer, ikuti instruksi pada Menjalankan Sampel WCF.

  4. Untuk menunjukkan bahwa layanan meniru pemanggil, jalankan klien di bawah akun yang berbeda dari yang dijalankan layanan. Untuk melakukannya, pada prompt perintah, ketik:

    runas /user:<machine-name>\<user-name> client.exe
    

    Anda kemudian dimintai kata sandi. Masukkan kata sandi untuk akun yang Anda tentukan sebelumnya.

  5. Saat Anda menjalankan klien, perhatikan identitas sebelum dan sesudah menjalankannya dengan kredensial yang berbeda.