Bagikan melalui


Penyedia Token

Sampel ini menunjukkan cara menerapkan penyedia token kustom. Penyedia token di Windows Communication Foundation (WCF) digunakan untuk menyediakan kredensial ke infrastruktur keamanan. Penyedia token secara umum memeriksa target dan mengeluarkan kredensial yang sesuai sehingga infrastruktur keamanan dapat mengamankan pesan. WCF dikirim dengan Penyedia Token Manajer Kredensial default. WCF juga dilengkapi dengan penyedia token CardSpace. Penyedia token kustom berguna dalam kasus berikut:

  • Jika Anda memiliki penyimpanan kredensial yang tidak dapat dioperasikan oleh penyedia token ini.

  • Jika Anda ingin menyediakan mekanisme kustom Anda sendiri untuk mengubah kredensial dari saat pengguna memberikan informasi hingga saat kerangka kerja klien WCF menggunakan kredensial tersebut.

  • Jika Anda membangun token kustom.

Sampel ini menunjukkan cara membangun penyedia token kustom yang mengubah input dari pengguna menjadi format yang berbeda.

Untuk meringkas, sampel ini menunjukkan hal berikut:

  • Bagaimana klien dapat mengautentikasi menggunakan pasangan nama pengguna/kata sandi.

  • Bagaimana klien dapat dikonfigurasi dengan penyedia token kustom.

  • Bagaimana server dapat memvalidasi kredensial klien menggunakan kata sandi dengan kustom UserNamePasswordValidator yang memvalidasi bahwa nama pengguna dan kata sandi cocok.

  • Cara server diautentikasi oleh klien menggunakan sertifikat X.509 server.

Sampel ini juga menunjukkan bagaimana identitas pemanggil dapat diakses setelah proses autentikasi token kustom.

Layanan ini mengekspos satu titik akhir untuk berkomunikasi dengan layanan, yang ditentukan menggunakan file konfigurasi App.config. Titik akhir terdiri dari alamat, pengikatan, dan kontrak. Pengikatan dikonfigurasi dengan standar wsHttpBinding, yang menggunakan keamanan pesan secara default. Sampel ini menetapkan standar wsHttpBinding untuk menggunakan autentikasi nama pengguna klien. Layanan ini juga mengonfigurasi sertifikat layanan menggunakan perilaku serviceCredentials. Perilaku serviceCredentials memungkinkan Anda mengonfigurasi sertifikat layanan. Sertifikat layanan digunakan oleh klien untuk mengautentikasi layanan dan memberikan perlindungan pesan. Konfigurasi berikut mereferensikan sertifikat localhost yang diinstal selama penyiapan sampel seperti yang dijelaskan dalam instruksi penyiapan berikut.

<system.serviceModel>
    <services>
      <service
          name="Microsoft.ServiceModel.Samples.CalculatorService"
          behaviorConfiguration="CalculatorServiceBehavior">
        <host>
          <baseAddresses>
            <!-- configure base address provided by host -->
            <add baseAddress ="http://localhost:8000/servicemodelsamples/service"/>
          </baseAddresses>
        </host>
        <!-- use base address provided by host -->
        <endpoint address=""
                  binding="wsHttpBinding"
                  bindingConfiguration="Binding1"
                  contract="Microsoft.ServiceModel.Samples.ICalculator" />
      </service>
    </services>

    <bindings>
      <wsHttpBinding>
        <binding name="Binding1">
          <security mode="Message">
            <message clientCredentialType="UserName" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>

    <behaviors>
      <serviceBehaviors>
        <behavior name="CalculatorServiceBehavior">
          <serviceDebug includeExceptionDetailInFaults="False" />
          <!--
        The serviceCredentials behavior allows one to define a service certificate.
        A service certificate is used by a client to authenticate the service and provide message protection.
        This configuration references the "localhost" certificate installed during the setup instructions.
        -->
          <serviceCredentials>
            <serviceCertificate findValue="localhost" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

Konfigurasi titik akhir klien terdiri dari nama konfigurasi, alamat absolut untuk titik akhir layanan, pengikatan, dan kontrak. Pengikatan klien dikonfigurasi dengan Mode dan pesan clientCredentialType yang sesuai.

<system.serviceModel>
  <client>
    <endpoint name=""
              address="http://localhost:8000/servicemodelsamples/service"
              binding="wsHttpBinding"
              bindingConfiguration="Binding1"
              contract="Microsoft.ServiceModel.Samples.ICalculator">
    </endpoint>
  </client>

  <bindings>
    <wsHttpBinding>
      <binding name="Binding1">
        <security mode="Message">
          <message clientCredentialType="UserName" />
        </security>
      </binding>
    </wsHttpBinding>
  </bindings>
</system.serviceModel>

Langkah-langkah berikut menunjukkan cara mengembangkan penyedia token kustom dan mengintegrasikannya dengan kerangka kerja keamanan WCF:

  1. Tulis penyedia token kustom.

    Sampel mengimplementasikan penyedia token kustom yang mendapatkan nama pengguna dan kata sandi. Kata sandi harus cocok dengan nama pengguna ini. Penyedia token kustom ini hanya untuk tujuan demonstrasi dan tidak direkomendasikan untuk penyebaran dunia nyata.

    Untuk melakukan tugas ini, penyedia token kustom menurunkan kelas SecurityTokenProvider dan menggantikan metode GetTokenCore(TimeSpan). Metode ini membuat dan mengembalikan sebuah baru UserNameSecurityToken.

    protected override SecurityToken GetTokenCore(TimeSpan timeout)
    {
        // obtain username and password from the user using console window
        string username = GetUserName();
        string password = GetPassword();
        Console.WriteLine("username: {0}", username);
    
        // return new UserNameSecurityToken containing information obtained from user
        return new UserNameSecurityToken(username, password);
    }
    
  2. Tulis manajer token keamanan kustom.

    SecurityTokenManager digunakan untuk membuat SecurityTokenProvider bagi SecurityTokenRequirement tertentu yang diteruskan ke dalam metode CreateSecurityTokenProvider. Manajer token keamanan juga digunakan untuk membuat pengautentikasi token dan serializer token, tetapi tidak tercakup oleh sampel ini. Dalam sampel ini, manajer token keamanan kustom mewarisi dari ClientCredentialsSecurityTokenManager kelas dan mengambil alih CreateSecurityTokenProvider metode untuk mengembalikan penyedia token nama pengguna kustom ketika persyaratan token yang diteruskan menunjukkan bahwa penyedia nama pengguna diminta.

    public class MyUserNameSecurityTokenManager : ClientCredentialsSecurityTokenManager
    {
        MyUserNameClientCredentials myUserNameClientCredentials;
    
        public MyUserNameSecurityTokenManager(MyUserNameClientCredentials myUserNameClientCredentials)
            : base(myUserNameClientCredentials)
        {
            this.myUserNameClientCredentials = myUserNameClientCredentials;
        }
    
        public override SecurityTokenProvider CreateSecurityTokenProvider(SecurityTokenRequirement tokenRequirement)
        {
            // if token requirement matches username token return custom username token provider
            // otherwise use base implementation
            if (tokenRequirement.TokenType == SecurityTokenTypes.UserName)
            {
                return new MyUserNameTokenProvider();
            }
            else
            {
                return base.CreateSecurityTokenProvider(tokenRequirement);
            }
        }
    }
    
  3. Tulis kredensial klien kustom.

    Kelas kredensial klien digunakan untuk mewakili kredensial yang dikonfigurasi untuk proksi klien dan menciptakan pengelola token keamanan yang digunakan untuk memperoleh pengautentikasi token, penyedia token, dan serialisasi token.

    public class MyUserNameClientCredentials : ClientCredentials
    {
        public MyUserNameClientCredentials()
            : base()
        {
        }
    
        protected override ClientCredentials CloneCore()
        {
            return new MyUserNameClientCredentials();
        }
    
        public override SecurityTokenManager CreateSecurityTokenManager()
        {
            // return custom security token manager
            return new MyUserNameSecurityTokenManager(this);
        }
    }
    
  4. Konfigurasikan klien untuk menggunakan kredensial klien kustom.

    Agar klien dapat menggunakan kredensial klien kustom, sampel menghapus kelas kredensial klien default dan menyediakan kelas kredensial klien baru.

    static void Main()
    {
        // ...
           // Create a client with given client endpoint configuration
          CalculatorClient client = new CalculatorClient();
    
          // set new credentials
           client.ChannelFactory.Endpoint.Behaviors.Remove(typeof(ClientCredentials));
         client.ChannelFactory.Endpoint.Behaviors.Add(new MyUserNameClientCredentials());
       // ...
    }
    

Pada layanan, untuk menampilkan informasi pemanggil, gunakan seperti yang PrimaryIdentity ditunjukkan dalam contoh kode berikut. Current berisi informasi klaim tentang pemanggil saat ini.

static void DisplayIdentityInformation()
{
    Console.WriteLine("\t\tSecurity context identity  :  {0}",
        ServiceSecurityContext.Current.PrimaryIdentity.Name);
}

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

Menyiapkan File Batch

File batch Setup.bat yang disertakan dengan sampel ini memungkinkan Anda mengonfigurasi server dengan sertifikat yang relevan untuk menjalankan aplikasi yang dihost sendiri yang memerlukan keamanan berbasis sertifikat server. File batch ini harus dimodifikasi untuk bekerja di seluruh komputer atau untuk bekerja dalam kasus yang tidak dihosting.

Berikut ini memberikan gambaran singkat tentang berbagai bagian file batch sehingga dapat dimodifikasi untuk dijalankan dalam konfigurasi yang sesuai:

  • Membuat sertifikat server.

    Baris berikut dari file batch Setup.bat membuat sertifikat server yang akan digunakan. Variabel %SERVER_NAME% menentukan nama server. Ubah variabel ini untuk menentukan nama server Anda sendiri. Nilai default dalam file batch ini adalah localhost.

    echo ************
    echo Server cert setup starting
    echo %SERVER_NAME%
    echo ************
    echo making server cert
    echo ************
    makecert.exe -sr LocalMachine -ss MY -a sha1 -n CN=%SERVER_NAME% -sky exchange -pe
    
  • Menginstal sertifikat server ke penyimpanan sertifikat tepercaya klien:

    Baris-baris berikut dalam file batch Setup.bat menyalin sertifikat server ke penyimpanan tepercaya klien. Langkah ini diperlukan karena sertifikat yang dihasilkan oleh Makecert.exe tidak dipercaya secara implisit oleh sistem klien. Jika Anda sudah memiliki sertifikat yang berakar pada sertifikat akar tepercaya klien—misalnya, sertifikat yang dikeluarkan Microsoft—langkah mengisi penyimpanan sertifikat klien dengan sertifikat server tidak diperlukan.

    certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeople
    

Nota

File batch Setup.bat dirancang untuk dijalankan dari Command Prompt Windows SDK. Hal ini mengharuskan variabel lingkungan MSSDK menunjuk ke direktori tempat SDK diinstal. Variabel lingkungan ini secara otomatis diatur dalam Prompt Perintah Windows SDK.

Untuk menyiapkan dan membangun sampel

  1. Pastikan Anda telah melakukan Prosedur Penyiapan One-Time untuk Sampel Windows Communication Foundation.

  2. Untuk membangun solusi, ikuti instruksi dalam Membangun Sampel Windows Communication Foundation.

Untuk menjalankan sampel pada komputer yang sama

  1. Jalankan Setup.bat dari folder penginstalan sampel di dalam prompt perintah Visual Studio yang dibuka dengan hak istimewa administrator. Ini menginstal semua sertifikat yang diperlukan untuk menjalankan sampel.

    Nota

    File batch Setup.bat dirancang untuk dijalankan dari Visual Studio Command Prompt. Variabel lingkungan PATH yang diatur dalam Prompt Perintah Visual Studio menunjuk ke direktori yang berisi executable yang diperlukan oleh skrip Setup.bat.

  2. Luncurkan service.exe dari service\bin.

  3. Luncurkan Client.exe dari \client\bin. Aktivitas klien ditampilkan pada aplikasi konsol klien.

  4. Pada perintah nama pengguna, ketik nama pengguna.

  5. Pada prompt kata sandi, gunakan string yang sama yang di ketikkan untuk perintah nama pengguna.

  6. Jika klien dan layanan tidak dapat berkomunikasi, lihat Tips Pemecahan Masalah untuk Sampel WCF.

Untuk menjalankan contoh program di berbagai komputer

  1. Buat direktori di komputer layanan untuk biner layanan.

  2. Salin file program layanan ke direktori layanan pada komputer layanan. Salin juga file Setup.bat dan Cleanup.bat ke komputer layanan.

  3. Anda harus memiliki sertifikat server dengan nama subjek yang berisi nama domain komputer yang sepenuhnya memenuhi syarat. File Service.exe.config harus diperbarui untuk mencerminkan nama sertifikat baru ini. Anda dapat membuat sertifikat server dengan memodifikasi file batch Setup.bat. Perhatikan bahwa file setup.bat harus dijalankan dari Developer Command Prompt untuk Visual Studio yang dibuka dengan hak administratif. Anda harus mengatur %SERVER_NAME% variabel ke nama host komputer yang sepenuhnya memenuhi syarat yang digunakan untuk menghosting layanan.

  4. Salin sertifikat server ke penyimpanan CurrentUser-TrustedPeople klien. Anda tidak perlu melakukan ini ketika sertifikat server dikeluarkan oleh penerbit tepercaya klien.

  5. Dalam file Service.exe.config di komputer layanan, ubah nilai alamat dasar untuk menentukan nama komputer yang sepenuhnya memenuhi syarat alih-alih localhost.

  6. Pada komputer servis, jalankan service.exe dari command prompt.

  7. Salin file program klien dari folder \client\bin\, di bawah folder khusus bahasa, ke komputer klien.

  8. Dalam file Client.exe.config di komputer klien, ubah nilai alamat titik akhir agar sesuai dengan alamat baru layanan Anda.

  9. Pada komputer klien, luncurkan Client.exe dari jendela prompt perintah.

  10. Jika klien dan layanan tidak dapat berkomunikasi, lihat Tips Pemecahan Masalah untuk Sampel WCF.

Untuk membersihkan setelah pengujian sampel

  1. Jalankan Cleanup.bat di folder sampel setelah Anda selesai menjalankan sampel.