Aracılığıyla paylaş


Nasıl yapılır: Özel Bir Kullanıcı Adı ve Parola Doğrulayıcı Kullanma

Varsayılan olarak, kimlik doğrulaması için bir kullanıcı adı ve parola kullanıldığında, Windows Communication Foundation (WCF) kullanıcı adını ve parolasını doğrulamak için Windows kullanır. Ancak WCF, doğrulayıcı olarak da bilinen özel kullanıcı adı ve parola kimlik doğrulama düzenlerine izin verir. Özel bir kullanıcı adı ve parola doğrulayıcı eklemek için, öğesinden UserNamePasswordValidator türetilen bir sınıf oluşturun ve sonra bunu yapılandırın.

Örnek bir uygulama için bkz . Kullanıcı Adı Parola Doğrulayıcısı.

Özel kullanıcı adı ve parola doğrulayıcı oluşturmak için

  1. öğesinden UserNamePasswordValidatortüretilen bir sınıf oluşturun.

    
    public class CustomUserNameValidator : UserNamePasswordValidator
    {
    
    Public Class CustomUserNameValidator
        Inherits UserNamePasswordValidator
    
  2. yöntemini geçersiz kılarak Validate özel kimlik doğrulama düzenini uygulayın.

    Aşağıdaki örnekte, üretim ortamında yöntemini geçersiz kılan Validate kodu kullanmayın. Kodu, veritabanından kullanıcı adı ve parola çiftlerini almayı içerebilecek özel kullanıcı adınız ve parola doğrulama düzeninizle değiştirin.

    kimlik doğrulama hatalarını istemciye geri döndürmek için yöntemine Validate bir FaultException oluşturun.

    // 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
    

Bir hizmeti özel kullanıcı adı ve parola doğrulayıcı kullanacak şekilde yapılandırmak için

  1. HTTP(S) üzerinden herhangi bir aktarım veya aktarım düzeyi güvenliği üzerinden ileti güvenliği kullanan bir bağlama yapılandırın.

    İleti güvenliğini kullanırken, wsHttpBinding veya< ileti güvenliğini ve UserName kimlik bilgisi türünü destekleyen customBinding>> gibi <sistem tarafından sağlanan bağlamalardan birini ekleyin.

    HTTP'ler üzerinde aktarım düzeyi güvenliği kullanırken, wsHttpBinding> veya< basicHttpBinding>,< netTcpBinding> veya HTTP(S) kullanan customBinding><ve Basic kimlik doğrulama düzenini ekleyin.<

    Not

    .NET Framework 3.5 veya sonraki sürümleri kullanırken, ileti ve aktarım güvenliği ile özel bir kullanıcı adı ve parola doğrulayıcı kullanabilirsiniz. WinFX ile özel kullanıcı adı ve parola doğrulayıcı yalnızca ileti güvenliğiyle kullanılabilir.

    İpucu

    Bu bağlamda netTcpBinding kullanma <hakkında daha fazla bilgi için bkz<. güvenlik>.>

    1. Yapılandırma dosyasında, system.serviceModel öğesinin <altına bir< bağlama öğesi> ekleyin.>

    2. Bağlamalar bölümüne bir wsHttpBinding> veya <temelHttpBinding> öğesi ekleyin.< WCF bağlama öğesi oluşturma hakkında daha fazla bilgi için bkz . Nasıl yapılır: Yapılandırmada Hizmet Bağlaması Belirtme.

    3. mode Güvenlik veya güvenliğin>>< özniteliğini , Transportveya <TransportWithMessageCredentialolarak Messageayarlayın.

    4. İletinin clientCredentialType> veya <aktarımın <>özniteliğini ayarlayın.

      İleti güvenliğini kullanırken, iletinin clientCredentialType>< özniteliğini olarak UserNameayarlayın.

      HTTP'ler üzerinde aktarım düzeyi güvenlik kullanırken, aktarım veya <aktarım>> özniteliğini <olarak Basicayarlayın.clientCredentialType

      Not

      Bir WCF hizmeti, aktarım düzeyi güvenlik kullanılarak Internet Information Services'te (IIS) barındırıldığında ve UserNamePasswordValidationMode özelliği olarak Customayarlandığında, özel kimlik doğrulama düzeni Windows kimlik doğrulamasının bir alt kümesini kullanır. Bunun nedeni, bu senaryoda IIS'nin WCF'nin özel kimlik doğrulayıcıyı çağırmadan önce Windows kimlik doğrulamasını gerçekleştirmesidir.

    WCF bağlama öğesi oluşturma hakkında daha fazla bilgi için bkz . Nasıl yapılır: Yapılandırmada Hizmet Bağlaması Belirtme.

    Aşağıdaki örnekte bağlamanın yapılandırma kodu gösterilmektedir:

    <system.serviceModel>
      <bindings>
      <wsHttpBinding>
          <binding name="Binding1">
            <security mode="Message">
              <message clientCredentialType="UserName" />
            </security>
          </binding>
        </wsHttpBinding>
      </bindings>
    </system.serviceModel>
    
  2. Gelen UserNameSecurityToken güvenlik belirteçleri için kullanıcı adı ve parola çiftlerini doğrulamak için özel kullanıcı adı ve parola doğrulayıcının kullanıldığını belirten bir davranış yapılandırın.

    1. system.serviceModel öğesinin <alt öğesi olarak bir< davranış öğesi> ekleyin.>

    2. behaviors öğesine serviceBehaviors ><<ekleyin.>

    3. Bir <davranış> öğesi ekleyin ve özniteliğini name uygun bir değere ayarlayın.

    4. davranış öğesine serviceCredentials><<ekleyin.>

    5. serviceCredentials> öğesine< userNameAuthentication<>ekleyin.

    6. userNamePasswordValidationMode ayarını Custom yapın.

      Önemli

      userNamePasswordValidationMode Değer ayarlanmazsa WCF, özel kullanıcı adı ve parola doğrulayıcı yerine Windows kimlik doğrulamasını kullanır.

    7. öğesini customUserNamePasswordValidatorType , özel kullanıcı adınızı ve parola doğrulayıcınızı temsil eden türe ayarlayın.

    Aşağıdaki örnekte bu noktaya kadar olan <serviceCredentials> parça gösterilmektedir:

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

Örnek

Aşağıdaki kod örneği, özel kullanıcı adı ve parola doğrulayıcının nasıl oluşturulacağını gösterir. Bir üretim ortamında yöntemini geçersiz kılan Validate kodu kullanmayın. Kodu, veritabanından kullanıcı adı ve parola çiftlerini almayı içerebilecek özel kullanıcı adınız ve parola doğrulama düzeninizle değiştirin.

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

Ayrıca bkz.