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
Buat kelas yang berasal dari UserNamePasswordValidator.
public class CustomUserNameValidator : UserNamePasswordValidator {
Public Class CustomUserNameValidator Inherits UserNamePasswordValidator
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
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>.
Dalam file konfigurasi, di bawah elemen <system.serviceModel>, tambahkan elemen <pengikatan>.
Tambahkan elemen <wsHttpBinding> atau <basicHttpBinding> ke bagian pengikatan. Untuk informasi selengkapnya tentang membuat elemen pengikatan WCF, lihat Cara untuk : Menentukan Pengikatan Layanan dalam Konfigurasi.
Atur atribut
mode
dari <keamanan> atau <keamanan> keMessage
,Transport
, atauTransportWithMessageCredential
.Atur atribut
clientCredentialType
dari <pesan> atau <transportasi>.Saat menggunakan keamanan pesan, atur atribut
clientCredentialType
dari <pesan> keUserName
.Saat menggunakan keamanan tingkat transportasi melalui HTTP(S), atur atribut
clientCredentialType
dari <transportasi> atau <transportasi> keBasic
.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>
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.
Sebagai turunan elemen <system.serviceModel>, tambahkan elemen <perilaku>.
Tambahkan elemen <serviceBehaviors> ke elemen <perilaku>.
Tambahkan elemen <perilaku> dan atur atribut
name
ke nilai yang sesuai.Tambahkan elemen <serviceCredentials> ke <perilaku>.
Tambahkan <userNameAuthentication> ke <serviceCredentials>.
Atur
userNamePasswordValidationMode
keCustom
.Penting
Jika nilai
userNamePasswordValidationMode
tidak diatur, WCF menggunakan autentikasi Windows alih-alih validator nama pengguna dan kata sandi kustom.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