Bagikan melalui


Cara: Menggunakan Validator Nama Pengguna dan Kata Sandi Kustom

Secara default, ketika nama pengguna dan kata sandi digunakan untuk autentikasi, Windows Communication Foundation (WCF) menggunakan Windows untuk memvalidasi nama pengguna dan kata sandi. Namun, WCF memungkinkan skema autentikasi nama pengguna dan kata sandi kustom, juga dikenal sebagai validator. Untuk menggabungkan validator nama pengguna dan kata sandi kustom, buat kelas yang berasal dari UserNamePasswordValidator lalu konfigurasikan.

Untuk aplikasi sampel, lihat Validator Kata Sandi Nama Pengguna.

Untuk membuat validator nama pengguna dan kata sandi kustom

  1. Buat kelas yang berasal dari UserNamePasswordValidator.

    
    public class CustomUserNameValidator : UserNamePasswordValidator
    {
    
    Public Class CustomUserNameValidator
        Inherits UserNamePasswordValidator
    
  2. Terapkan skema autentikasi kustom dengan mengganti metode Validate.

    Jangan gunakan kode dalam contoh berikut yang mengambil alih metode Validate di lingkungan produksi. Ganti kode dengan nama pengguna kustom dan skema validasi kata sandi Anda, yang mungkin melibatkan pengambilan pasangan nama pengguna dan kata sandi dari database.

    Untuk mengembalikan kesalahan autentikasi kembali ke klien, lemparkan FaultException ke dalam metode Validate.

    // This method validates users. It allows in two users, test1 and test2
    // with passwords 1tset and 2tset respectively.
    // This code is for illustration purposes only and
    // must not be used in a production environment because it is not secure.
    public override void Validate(string userName, string password)
    {
        if (null == userName || null == password)
        {
            throw new ArgumentNullException();
        }
    
        if (!(userName == "test1" && password == "1tset") && !(userName == "test2" && password == "2tset"))
        {
            // This throws an informative fault to the client.
            throw new FaultException("Unknown Username or Incorrect Password");
            // When you do not want to throw an informative fault to the client,
            // throw the following exception.
            // throw new SecurityTokenException("Unknown Username or Incorrect Password");
        }
    }
    
    ' This method validates users. It allows in two users, test1 and test2
    ' with passwords 1tset and 2tset respectively.
    ' This code is for illustration purposes only and
    ' must not be used in a production environment because it is not secure.
    Public Overrides Sub Validate(ByVal userName As String, ByVal password As String)
        If Nothing = userName OrElse Nothing = password Then
            Throw New ArgumentNullException()
        End If
    
        If Not (userName = "test1" AndAlso password = "[PLACEHOLDER]") AndAlso Not (userName = "test2" AndAlso password = "[PLACEHOLDER]") Then
            ' This throws an informative fault to the client.
            Throw New FaultException("Unknown Username or Incorrect Password")
            ' When you do not want to throw an informative fault to the client,
            ' throw the following exception:
            ' Throw New SecurityTokenException("Unknown Username or Incorrect Password")
        End If
    
    End Sub
    

Untuk mengonfigurasi layanan agar menggunakan validator nama pengguna dan kata sandi kustom

  1. Mengonfigurasi pengikatan yang menggunakan keamanan pesan melalui keamanan tingkat transportasi atau transportasi melalui HTTP.

    Saat menggunakan keamanan pesan, tambahkan salah satu pengikatan yang disediakan sistem, seperti <wsHttpBinding>, atau <customBinding> yang mendukung keamanan pesan dan jenis mandat UserName.

    Saat menggunakan keamanan tingkat transportasi melalui HTTP(S), tambahkan <wsHttpBinding> atau <basicHttpBinding>, <netTcpBinding> atau <customBinding> yang menggunakan HTTP(S) dan skema autentikasi Basic.

    Catatan

    Saat menggunakan .NET Framework 3.5 atau versi yang lebih baru, Anda dapat menggunakan validator nama pengguna dan kata sandi kustom dengan keamanan pesan dan transportasi. Dengan WinFX, validator nama pengguna dan kata sandi kustom hanya dapat digunakan dengan keamanan pesan.

    Tip

    Untuk informasi selengkapnya tentang menggunakan <netTcpBinding> dalam konteks ini, lihat <keamanan>.

    1. Dalam file konfigurasi, di bawah elemen <system.serviceModel>, tambahkan elemen <pengikatan>.

    2. Tambahkan elemen <wsHttpBinding> atau <basicHttpBinding> ke bagian pengikatan. Untuk informasi selengkapnya tentang membuat elemen pengikatan WCF, lihat Cara untuk : Menentukan Pengikatan Layanan dalam Konfigurasi.

    3. Atur atribut mode dari <keamanan> atau <keamanan> ke Message, Transport, atau TransportWithMessageCredential.

    4. Atur atribut clientCredentialType dari <pesan> atau <transportasi>.

      Saat menggunakan keamanan pesan, atur atribut clientCredentialType dari <pesan> ke UserName.

      Saat menggunakan keamanan tingkat transportasi melalui HTTP(S), atur atribut clientCredentialType dari <transportasi> atau <transportasi> ke Basic.

      Catatan

      Ketika layanan WCF dihosting di Layanan Informasi Internet (IIS) menggunakan keamanan tingkat transportasi dan properti UserNamePasswordValidationMode diatur ke Custom, skema autentikasi kustom menggunakan subset autentikasi Windows. Itu karena dalam skenario ini, IIS melakukan autentikasi Windows sebelum WCF memanggil pengautentikasi kustom.

    Untuk informasi selengkapnya tentang membuat elemen pengikatan WCF, lihat Cara untuk : Menentukan Pengikatan Layanan dalam Konfigurasi.

    Contoh berikut menunjukkan kode konfigurasi untuk pengikatan:

    <system.serviceModel>
      <bindings>
      <wsHttpBinding>
          <binding name="Binding1">
            <security mode="Message">
              <message clientCredentialType="UserName" />
            </security>
          </binding>
        </wsHttpBinding>
      </bindings>
    </system.serviceModel>
    
  2. Konfigurasikan perilaku yang menentukan bahwa validator nama pengguna dan kata sandi kustom digunakan untuk memvalidasi pasangan nama pengguna dan kata sandi untuk token keamanan masuk UserNameSecurityToken.

    1. Sebagai turunan elemen <system.serviceModel>, tambahkan elemen <perilaku>.

    2. Tambahkan elemen <serviceBehaviors> ke elemen <perilaku>.

    3. Tambahkan elemen <perilaku> dan atur atribut name ke nilai yang sesuai.

    4. Tambahkan elemen <serviceCredentials> ke <perilaku>.

    5. Tambahkan <userNameAuthentication> ke <serviceCredentials>.

    6. Atur userNamePasswordValidationMode ke Custom.

      Penting

      Jika nilai userNamePasswordValidationMode tidak diatur, WCF menggunakan autentikasi Windows alih-alih validator nama pengguna dan kata sandi kustom.

    7. Atur customUserNamePasswordValidatorType ke jenis yang mewakili nama pengguna kustom dan validator kata sandi Anda.

    Contoh berikut menunjukkan fragmen <serviceCredentials> hingga saat ini:

    <serviceCredentials>
      <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="Microsoft.ServiceModel.Samples.CalculatorService.CustomUserNameValidator, service" />
    </serviceCredentials>
    

Contoh

Contoh kode berikut menunjukkan cara membuat validator nama pengguna dan kata sandi kustom. Jangan gunakan kode yang mengambil alih metode Validate di lingkungan produksi. Ganti kode dengan nama pengguna kustom dan skema validasi kata sandi Anda, yang mungkin melibatkan pengambilan pasangan nama pengguna dan kata sandi dari database.

using System;
using System.IdentityModel.Selectors;
using System.IdentityModel.Tokens;

using System.Security.Principal;

using System.ServiceModel;
Imports System.IdentityModel.Selectors
Imports System.IdentityModel.Tokens

Imports System.Security.Principal

Imports System.ServiceModel

public class CustomUserNameValidator : UserNamePasswordValidator
{
    // This method validates users. It allows in two users, test1 and test2
    // with passwords 1tset and 2tset respectively.
    // This code is for illustration purposes only and
    // must not be used in a production environment because it is not secure.
    public override void Validate(string userName, string password)
    {
        if (null == userName || null == password)
        {
            throw new ArgumentNullException();
        }

        if (!(userName == "test1" && password == "1tset") && !(userName == "test2" && password == "2tset"))
        {
            // This throws an informative fault to the client.
            throw new FaultException("Unknown Username or Incorrect Password");
            // When you do not want to throw an informative fault to the client,
            // throw the following exception.
            // throw new SecurityTokenException("Unknown Username or Incorrect Password");
        }
    }
}
Public Class CustomUserNameValidator
    Inherits UserNamePasswordValidator
    ' This method validates users. It allows in two users, test1 and test2
    ' with passwords 1tset and 2tset respectively.
    ' This code is for illustration purposes only and
    ' must not be used in a production environment because it is not secure.
    Public Overrides Sub Validate(ByVal userName As String, ByVal password As String)
        If Nothing = userName OrElse Nothing = password Then
            Throw New ArgumentNullException()
        End If

        If Not (userName = "test1" AndAlso password = "[PLACEHOLDER]") AndAlso Not (userName = "test2" AndAlso password = "[PLACEHOLDER]") Then
            ' This throws an informative fault to the client.
            Throw New FaultException("Unknown Username or Incorrect Password")
            ' When you do not want to throw an informative fault to the client,
            ' throw the following exception:
            ' Throw New SecurityTokenException("Unknown Username or Incorrect Password")
        End If

    End Sub
End Class

Lihat juga