Comment : utiliser un validateur de nom d'utilisateur et de mot de passe personnalisé

Par défaut, lorsqu'un nom d'utilisateur et un mot de passe sont utilisés pour l'authentification, Windows Communication Foundation (WCF) utilise Windows pour valider le nom d'utilisateur et le mot de passe. Toutefois, WCF autorise l'utilisation de schémas d'authentification par nom d'utilisateur et mot de passe personnalisés, également connus sous le nom de validateurs. Pour incorporer un validateur de nom d'utilisateur et de mot de passe personnalisé, créez une classe qui dérive de UserNamePasswordValidator, puis configurez-la.

Pour obtenir un exemple d'application, consultez Validateur de nom d'utilisateur et de mot de passe.

Pour créer validateur de nom d'utilisateur et de mot de passe personnalisé

  1. Créez une classe qui dérive de UserNamePasswordValidator.

    Public Class CustomUserNameValidator
        Inherits UserNamePasswordValidator
    
    public class CustomUserNameValidator : UserNamePasswordValidator
    {
    
  2. Implémentez le schéma d'authentification personnalisé en substituant la méthode Validate.

    N'utilisez pas le code dans l'exemple suivant qui substitue la méthode Validate dans un environnement de production. Remplacez le code par votre schéma de validation de nom d'utilisateur et de mot de passe personnalisé, ce qui peut impliquer la récupération de paires nom d'utilisateur/mot de passe à partir d'une base de données.

    Pour renvoyer des erreurs d'authentification au client, levez une exception FaultException dans la méthode 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 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 = "1tset") AndAlso Not (userName = "test2" AndAlso password = "2tset") 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 infomative fault to the client,
            ' throw the following exception.
            ' Throw New SecurityTokenException("Unknown Username or Incorrect Password")
        End If
    
    End Sub
    
    // 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 infomative fault to the client,
            // throw the following exception.
            // throw new SecurityTokenException("Unknown Username or Incorrect Password");
        }
    }
    

Pour configurer un service pour utiliser un validateur de nom d'utilisateur et de mot de passe personnalisé

  1. Configurez une liaison qui utilise la sécurité de message sur un transport ou la sécurité au niveau du transport sur HTTP(S)

    Lors de l'utilisation de la sécurité de message, ajoutez une des liaisons fournies par le système, telles que wsHttpBinding Element ou customBinding Element qui prend en charge la sécurité de message et le type d'information d'identification UserName.

    Lorsque vous utilisez la sécurité au niveau du transport sur HTTP(S), ajoutez soit wsHttpBinding Element, soit <basicHttpBinding> et un <netTcpBinding> ou un customBinding Element qui utilise HTTP(S) et le schéma d'authentification Basic.

    Aa702565.note(fr-fr,VS.100).gifRemarque :
    Lors de l'utilisation du .NET Framework version 3.5 ou une version ultérieure, vous pouvez utiliser un validateur personnalisé de mot de passe et de nom d'utilisateur avec la sécurité de transport et de message. Avec .NET Framework 3.0, seul un validateur personnalisé de mot de passe et de nom d'utilisateur peut être utilisé avec la sécurité de message.

    Aa702565.Tip(fr-fr,VS.100).gifConseil :
    Pour plus d'informations sur l'utilisation de <netTcpBinding> dans ce contexte, consultez <security> of <netTcpBinding>.

    1. Dans le fichier de configuration, sous l'élément <system.ServiceModel>, ajoutez un élément <bindings>.

    2. Ajoutez un élément wsHttpBinding Element ou <basicHttpBinding> à la section des liaisons. Pour plus d'informations sur le sujet suivant la création d'un élément de liaison WCF, consultez Comment : spécifier une liaison de service dans la configuration.

    3. Affectez à l'attribut mode de security element of wsHttpBinding ou <security> of <basicHttpBinding> les valeurs Message, Transport, or TransportWithMessageCredential.

    4. Définissez l'attribut clientCredentialType de message element of wsHttpBinding ou <transport> of <wsHttpBinding>.

      Lors de l'utilisation de la sécurité de message, attribuez à l'attribut clientCredentialType de message element of wsHttpBinding la valeur UserName.

      Si vous utilisez la sécurité au niveau du transport sur HTTP(S), affectez à l'attribut clientCredentialType de <transport> of <wsHttpBinding> ou <transport> of <basicHttpBinding> la valeur Basic.

      Aa702565.note(fr-fr,VS.100).gifRemarque :
      Lorsqu'un service WCF est hébergé dans IIS (Internet Information Services) à l'aide de la sécurité au niveau du transport et que la propriété UserNamePasswordValidationMode a la valeur Custom, le schéma d'authentification personnalisé utilise un sous-ensemble de l'authentification Windows. Cela est dû au fait que dans ce scénario, IIS effectue une authentification Windows avant que WCF n'appelle l'authentificateur personnalisé.

    Pour plus d'informations sur le sujet suivant la création d'un élément de liaison WCF, consultez Comment : spécifier une liaison de service dans la configuration.

    L'exemple suivant présente le code de configuration de la liaison.

    <system.serviceModel> 
      <bindings>
      <wsHttpBinding>
          <binding name="Binding1">
            <security mode="Message">
              <message clientCredentialType="UserName" />
            </security>
          </binding>        
        </wsHttpBinding>
      </bindings>
    </system.serviceModel>
    
  2. Configurez un comportement qui spécifie qu'un validateur de nom d'utilisateur et de mot de passe personnalisé est utilisé pour valider des paires nom d'utilisateur/mot de passe pour les jetons de sécurité UserNameSecurityToken entrants.

    1. Ajoutez un élément <system.serviceModel> en tant qu'enfant de l'élément <behaviors>.

    2. Ajoutez un serviceBehaviors section à l'élément <behaviors>.

    3. Ajoutez un élément <behavior>, puis affectez à l'attribut name une valeur appropriée.

    4. Ajoutez un <serviceCredentials> Element à l'élément <behavior>.

    5. Ajoutez un userNameAuthentication element au <serviceCredentials> Element.

    6. Affectez la valeurCustom à userNamePasswordValidationMode.

      Aa702565.Important(fr-fr,VS.100).gif Remarque :
      Si la valeur userNamePasswordValidationMode n'est pas définie, WCF utilise l'authentification Windows au lieu du validateur de nom d'utilisateur et de mot de passe personnalisé.

    7. Affectez au customUserNamePasswordValidatorType le type qui représente votre validateur de nom d'utilisateur et de mot de passe personnalisé.

    L'exemple suivant présente le fragment <serviceCredentials> à ce point.

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

Exemple

L'exemple de code suivant montre comment créer un validateur de nom d'utilisateur et de mot de passe personnalisé. N'utilisez pas le code qui substitue la méthode Validate dans un environnement de production. Remplacez le code par votre schéma de validation de nom d'utilisateur et de mot de passe personnalisé, ce qui peut impliquer la récupération de paires nom d'utilisateur/mot de passe à partir d'une base de données.

Imports System

Imports System.IdentityModel.Selectors
Imports System.IdentityModel.Tokens

Imports System.Security.Principal

Imports System.ServiceModel

    

    
    ...
    
    

        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 = "1tset") AndAlso Not (userName = "test2" AndAlso password = "2tset") 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 infomative fault to the client,
                ' throw the following exception.
                ' Throw New SecurityTokenException("Unknown Username or Incorrect Password")
            End If

        End Sub
    End Class
using System;
using System.IdentityModel.Selectors;
using System.IdentityModel.Tokens;

using System.Security.Principal;

using 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 infomative fault to the client,
                    // throw the following exception.
                    // throw new SecurityTokenException("Unknown Username or Incorrect Password");
                }
            }
        }

Voir aussi

Tâches

Comment : utiliser le fournisseur d'appartenances ASP.NET

Référence

UserNamePasswordValidator

Autres ressources

Authentification