Procedimiento para usar un nombre de usuario personalizado y un validador de contraseñasHow to: Use a Custom User Name and Password Validator

De forma predeterminada, cuando se usa un nombre de usuario y una contraseña para la autenticación, Windows Communication Foundation (WCF) usa Windows para validar el nombre de usuario y la contraseña.By default, when a user name and password is used for authentication, Windows Communication Foundation (WCF) uses Windows to validate the user name and password. Sin embargo, WCF permite esquemas de autenticación de nombre de usuario y contraseña personalizados, también conocidos como validadores.However, WCF allows for custom user name and password authentication schemes, also known as validators. Para incorporar un nombre de usuario personalizado y un validador de contraseña, cree una clase que derive de UserNamePasswordValidator y, a continuación, configúrela.To incorporate a custom user name and password validator, create a class that derives from UserNamePasswordValidator and then configure it.

Para obtener una aplicación de ejemplo, consulte validador de contraseña de nombre de usuario.For a sample application, see User Name Password Validator.

Para crear un nombre de usuario personalizado y un validador de contraseñasTo create a custom user name and password validator

  1. Cree una clase que derive de UserNamePasswordValidator.Create a class that derives from UserNamePasswordValidator.

    
    public class CustomUserNameValidator : UserNamePasswordValidator
    {
    
    Public Class CustomUserNameValidator
        Inherits UserNamePasswordValidator
    
  2. Implemente el esquema personalizado de autenticación invalidando el método Validate.Implement the custom authentication scheme by overriding the Validate method.

    No utilice el código en el ejemplo siguiente que invalida el método Validate en un entorno de producción.Do not use the code in the following example that overrides the Validate method in a production environment. Reemplace el código con su nombre de usuario personalizado y esquema de validación de contraseña, que podrían implicar la recuperación de los pares de nombre de usuario y contraseña de una base de datos.Replace the code with your custom user name and password validation scheme, which might involve retrieving user name and password pairs from a database.

    Para devolver errores de autenticación al cliente, genere una FaultException en el método Validate.To return authentication errors back to the client, throw a FaultException in the Validate method.

    // 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");
        }
    }
    
    ' 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
    

Para configurar un servicio con el fin de utilizar un nombre de usuario personalizado y un validador de contraseñasTo configure a service to use a custom user name and password validator

  1. Configure un enlace que utilice la seguridad de mensaje sobre cualquier transporte o la seguridad del nivel de transporte sobre HTTP(S).Configure a binding that uses message security over any transport or transport-level security over HTTP(S).

    Al utilizar la seguridad de mensaje, agregue uno de los enlaces proporcionados por el sistema, como un <wsHttpBinding >o un <> customBinding que admita la seguridad de UserName mensaje y el tipo de credencial.When using message security, add one of the system-provided bindings, such as a <wsHttpBinding>, or a <customBinding> that supports message security and the UserName credential type.

    Al utilizar la seguridad de nivel de transporte sobre http (S), agregue el <> wsHttpBinding o <basicHttpBinding >, un <> netTcpBinding o un <customBinding > que usa http (S) y el Basic esquema de autenticación.When using transport-level security over HTTP(S), add either the <wsHttpBinding> or <basicHttpBinding>, a <netTcpBinding> or a <customBinding> that uses HTTP(S) and the Basic authentication scheme.

    Nota

    Si se utiliza .NET Framework versión 3,5.NET Framework version 3.5 o una versión posterior, puede usarse un validador de nombre de usuario y de contraseña personalizado con la seguridad de mensaje y de transporte.When .NET Framework versión 3,5.NET Framework version 3.5 or later is used, you can use a custom username and password validator with message and transport security. Con WinFX, un validador de nombre de usuario y contraseña personalizados solo se puede usar con la seguridad de mensajes.With WinFX, a custom username and password validator can only be used with message security.

    Sugerencia

    Para obtener más información sobre <el uso de la > netTcpBinding en este contexto, vea <seguridad >For more information on using <netTcpBinding> in this context, see <security>

    1. En el archivo de configuración, en el <elemento System. ServiceModel > , agregue un <elemento bindings > .In the configuration file, under the <system.serviceModel> element, add a <bindings> element.

    2. Agregue un <elemento wsHttpBinding > o <basicHttpBinding > a la sección de enlaces.Add a <wsHttpBinding> or <basicHttpBinding> element to the bindings section. Para obtener más información sobre cómo crear un elemento de enlace de WCF, consulte Cómo: Especifique un enlace de servicio enla configuración.For more information about creating an WCF binding element, see How to: Specify a Service Binding in Configuration.

    3. Establezca el mode atributo del <> de seguridad o <el > de seguridad en Message, TransportWithMessageCredential Transporto.Set the mode attribute of the <security> or <security> to Message, Transport, or TransportWithMessageCredential.

    4. Establezca el clientCredentialType atributo <del > de mensajes o <del > de transporte.Set the clientCredentialType attribute of the <message> or <transport>.

      Al utilizar la seguridad clientCredentialType UserName < de mensaje, establezca el atributo del mensaje > en.When using message security, set the clientCredentialType attribute of the <message> to UserName.

      Al utilizar la seguridad de nivel de transporte sobre http (S), clientCredentialType establezca el atributo <del > de transporte o <transporte > en. BasicWhen using transport-level security over HTTP(S), set the clientCredentialType attribute of the <transport> or <transport> to Basic.

      Nota

      Cuando un servicio WCF se hospeda en Internet Information Services (IIS) mediante la seguridad de nivel de transporte UserNamePasswordValidationMode y la propiedad se Customestablece en, el esquema de autenticación personalizado utiliza un subconjunto de autenticación de Windows.When a WCF service is hosted in Internet Information Services (IIS) using transport-level security and the UserNamePasswordValidationMode property is set to Custom, the custom authentication scheme uses a subset of Windows authentication. Esto se debe a que, en este escenario, IIS realiza la autenticación de Windows antes de que WCF invoque al autenticador personalizado.That is because in this scenario, IIS performs Windows authentication prior to WCF invoking the custom authenticator.

    Para obtener más información sobre cómo crear un elemento de enlace de WCF, consulte Cómo: Especifique un enlace de servicio enla configuración.For more information about creating an WCF binding element, see How to: Specify a Service Binding in Configuration.

    El siguiente ejemplo muestra el código de configuración para el enlace.The following example shows the configuration code for the binding.

    <system.serviceModel>
      <bindings>
      <wsHttpBinding>
          <binding name="Binding1">
            <security mode="Message">
              <message clientCredentialType="UserName" />
            </security>
          </binding>
        </wsHttpBinding>
      </bindings>
    </system.serviceModel>
    
  2. Configure un comportamiento que especifique que un nombre de usuario personalizado y el validador de contraseñas se utilizan para validar los pares de nombre de usuario y para los tokens de seguridad UserNameSecurityToken entrantes.Configure a behavior that specifies that a custom user name and password validator is used to validate user name and password pairs for incoming UserNameSecurityToken security tokens.

    1. Como elemento secundario <del elemento System. ServiceModel > , agregue un <elemento Behaviors > .As a child to the <system.serviceModel> element, add a <behaviors> element.

    2. Agregue un < >serviceBehaviorsalelementoBehaviors>.<Add a <serviceBehaviors> to the <behaviors> element.

    3. Agregue un elemento de <> de comportamiento y name establezca el atributo en un valor adecuado.Add a <behavior> element and set the name attribute to an appropriate value.

    4. Agregue un <> serviceCredentials al elemento <> de comportamiento .Add a <serviceCredentials> to the <behavior> element.

    5. Agregue un <> userNameAuthentication a la <> serviceCredentials.Add a <userNameAuthentication> to the <serviceCredentials>.

    6. Establezca userNamePasswordValidationMode en Custom.Set the userNamePasswordValidationMode to Custom.

      Importante

      Si no userNamePasswordValidationMode se establece el valor, WCF usa la autenticación de Windows en lugar del nombre de usuario personalizado y el validador de contraseñas.If the userNamePasswordValidationMode value is not set, WCF uses Windows authentication instead of the custom user name and password validator.

    7. Establezca customUserNamePasswordValidatorType en el tipo que representa su nombre de usuario personalizado y el validador de la contraseña.Set the customUserNamePasswordValidatorType to the type that represents your custom user name and password validator.

    El ejemplo siguiente muestra el fragmento <serviceCredentials> en este punto.The following example shows the <serviceCredentials> fragment to this point.

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

EjemploExample

El ejemplo de código siguiente muestra cómo crear un nombre de usuario personalizado y el validador de la contraseña.The following code example demonstrates how to create a custom user name and password validator. No utilice el código que invalida el método Validate en un entorno de producción.Do not use the code that overrides the Validate method in a production environment. Reemplace el código con su nombre de usuario personalizado y esquema de validación de contraseña, que podrían implicar la recuperación de los pares de nombre de usuario y contraseña de una base de datos.Replace the code with your custom user name and password validation scheme, which might involve retrieving user name and password pairs from a 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 infomative 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 = "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

Vea tambiénSee also