Cómo utilizar 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 utiliza un nombre de usuario y una contraseña para la autenticación, Windows Communication Foundation (WCF) utiliza 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 y contraseña de usuario personalizada, también conocido 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 una aplicación de ejemplo, vea 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 los mensajes, agregar uno de los enlaces proporcionados por el sistema, como un <wsHttpBinding >, o un <customBinding > que admite seguridad de mensajes y la UserName 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 usar la seguridad de nivel de transporte sobre HTTP (S), agregue el <wsHttpBinding > o <basicHttpBinding >, < netTcpBinding > o un <customBinding > que utilice 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 WinFXWinFX, solo puede utilizarse un validador de nombre de usuario y de contraseña con la seguridad de mensaje.With WinFXWinFX, a custom username and password validator can only be used with message security.

    Sugerencia

    Para obtener más información sobre el uso de <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 la <system.serviceModel > elemento, agregue un <enlaces > elemento.In the configuration file, under the <system.serviceModel> element, add a <bindings> element.

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

    3. Establecer el mode atributo de la <seguridad > o <seguridad > a Message, Transport, or``TransportWithMessageCredential.Set the mode attribute of the <security> or <security> to Message, Transport, or``TransportWithMessageCredential.

    4. Establecer el clientCredentialType atributo de la <mensaje > o <transporte >.Set the clientCredentialType attribute of the <message> or <transport>.

      Al utilizar la seguridad de los mensajes, establezca la clientCredentialType atributo de la <mensaje > a UserName.When using message security, set the clientCredentialType attribute of the <message> to UserName.

      Al usar la seguridad de nivel de transporte sobre HTTP (S), establezca el clientCredentialType atributo de la <transporte > o <transporte > a Basic.When 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 y la UserNamePasswordValidationMode propiedad está establecida en Custom, 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. Eso es porque en este escenario, IIS realiza la autenticación de Windows antes de WCF que se 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 acerca de cómo crear un elemento de enlace de WCF, vea Cómo: especificar un enlace de servicio en la 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 de la <system.serviceModel > elemento, agregue un <comportamientos > elemento.As a child to the <system.serviceModel> element, add a <behaviors> element.

    2. Agregar un <serviceBehaviors > a la <comportamientos > elemento.Add a <serviceBehaviors> to the <behaviors> element.

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

    4. Agregar un <serviceCredentials > a la <comportamiento > elemento.Add a <serviceCredentials> to the <behavior> element.

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

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

      Importante

      Si el userNamePasswordValidationMode valor no está establecido, WCF usa la autenticación de Windows en lugar de validador de nombre y la contraseña de usuario personalizada.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

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

UserNamePasswordValidator
Uso del proveedor de pertenencia de ASP.NETHow to: Use the ASP.NET Membership Provider
AutenticaciónAuthentication