Vorgehensweise: Verwenden eines benutzerdefinierten Benutzernamens und eines Kennwort-ValidierungssteuerelementsHow to: Use a Custom User Name and Password Validator

Wenn Sie einen Benutzernamen und ein Kennwort für die Authentifizierung verwendet wird, verwendet Windows Communication Foundation (WCF) standardmäßig Windows so überprüfen Sie den Benutzernamen und Kennwort.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. WCF ermöglicht jedoch benutzerdefinierten Benutzernamen- und Kennwort-Authentifizierungsschemas, auch bekannt als Validierungssteuerelemente.However, WCF allows for custom user name and password authentication schemes, also known as validators. Zum Verwenden eines benutzerdefinierten Benutzernamen- und Kennwort-Validierungssteuerelements erstellen und konfigurieren Sie eine Klasse, die sich von UserNamePasswordValidator ableitet.To incorporate a custom user name and password validator, create a class that derives from UserNamePasswordValidator and then configure it.

Eine beispielanwendung finden Sie unter Benutzer und Kennwort-Validierungssteuerelement.For a sample application, see User Name Password Validator.

So erstellen Sie ein benutzerdefiniertes Benutzernamen- und Kennwort-ValidierungssteuerelementTo create a custom user name and password validator

  1. Erstellen Sie eine von der UserNamePasswordValidator-Klasse abgeleitete Klasse.Create a class that derives from UserNamePasswordValidator.

    
    public class CustomUserNameValidator : UserNamePasswordValidator
    {
    
    Public Class CustomUserNameValidator
        Inherits UserNamePasswordValidator
    
  2. Implementieren Sie ein benutzerdefiniertes Authentifizierungsschema, indem Sie die Validate-Methode außer Kraft setzen.Implement the custom authentication scheme by overriding the Validate method.

    Verwenden Sie nicht den Code des folgenden Beispiels, der die Validate-Methode in einer Produktionsumgebung außer Kraft setzt.Do not use the code in the following example that overrides the Validate method in a production environment. Ersetzen Sie den Code mit dem benutzerdefinierten Benutzernamen- und Kennwort-Validierungsschema. Möglicherweise müssen der Benutzername und das zugehörige Kennwort aus einer Datenbank abgerufen werden.Replace the code with your custom user name and password validation scheme, which might involve retrieving user name and password pairs from a database.

    Um dem Client Authentifizierungsfehler zurückzugeben, lösen Sie in der FaultException-Methode eine Validate aus.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
    

So konfigurieren Sie einen Dienst für das Verwenden eines benutzerdefinierten Benutzernamen- und Kennwort-ValidierungssteuerelementsTo configure a service to use a custom user name and password validator

  1. Konfigurieren Sie eine Bindung, die Nachrichtensicherheit über jedes beliebige Transportprotokoll oder Sicherheit auf Transportebene über HTTP(S) verwendet.Configure a binding that uses message security over any transport or transport-level security over HTTP(S).

    Bei Verwendung von nachrichtensicherheit fügen Sie eine der vom System bereitgestellte Bindungen, wie z. B. eine <WsHttpBinding >, oder ein <CustomBinding > die Sicherheit unterstützt für Nachrichten und die UserName Anmeldeinformationstyp.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.

    Wenn Sie Sicherheit auf Transportebene über HTTP(s) verwenden, fügen Sie entweder die <WsHttpBinding > oder <BasicHttpBinding >, < NetTcpBinding > oder ein <CustomBinding > , HTTP (S) verwendet und die Basic -Authentifizierungsschema.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.

    Hinweis

    Wenn Sie .NET Framework Version 3.5.NET Framework version 3.5 oder höher verwenden, können Sie ein benutzerdefiniertes Benutzernamen- und Kennwort-Validierungssteuerelement mit Nachrichten- und Transportsicherheit nutzen.When .NET Framework Version 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. In Verbindung mit WinFXWinFX kann ein benutzerdefiniertes Benutzername- und Kennwort-Validierungssteuerelement nur mit Nachrichtensicherheit verwendet werden.With WinFXWinFX, a custom username and password validator can only be used with message security.

    Tipp

    Weitere Informationen zur Verwendung von <NetTcpBinding > in diesem Kontext finden Sie unter <Sicherheit >For more information on using <netTcpBinding> in this context, see <security>

    1. In der Konfigurationsdatei unter der <system.serviceModel > Element, Hinzufügen einer <Bindungen > Element.In the configuration file, under the <system.serviceModel> element, add a <bindings> element.

    2. Hinzufügen einer <WsHttpBinding > oder <BasicHttpBinding > Element im Abschnitt über Bindungen.Add a <wsHttpBinding> or <basicHttpBinding> element to the bindings section. Weitere Informationen zum Erstellen einer WCF-Bindungselements finden Sie unter wie: Angeben einer Dienstbindung in einer Konfiguration.For more information about creating an WCF binding element, see How to: Specify a Service Binding in Configuration.

    3. Legen Sie die mode Attribut des der <Sicherheit > oder <Sicherheit > auf Message, Transport, or``TransportWithMessageCredential.Set the mode attribute of the <security> or <security> to Message, Transport, or``TransportWithMessageCredential.

    4. Legen Sie die clientCredentialType Attribut von der <Nachricht > oder <Transport >.Set the clientCredentialType attribute of the <message> or <transport>.

      Legen Sie bei Verwendung von nachrichtensicherheit die clientCredentialType Attribut des der <Nachricht > auf UserName.When using message security, set the clientCredentialType attribute of the <message> to UserName.

      Wenn Sicherheit auf Transportebene über HTTP(s) verwenden, legen Sie die clientCredentialType Attribut des der <Transport > oder <Transport > auf Basic.When using transport-level security over HTTP(S), set the clientCredentialType attribute of the <transport> or <transport> to Basic.

      Hinweis

      Wenn ein WCF-Dienst in IIS (Internetinformationsdienste) mit Sicherheit auf Transportebene gehostet wird und die UserNamePasswordValidationMode -Eigenschaftensatz auf Custom, das benutzerdefinierte Authentifizierungsschema einer Teilmenge der Windows-Authentifizierung.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. Das liegt daran in diesem Szenario IIS Windows-Authentifizierung vor den benutzerdefinierten Authentifizierer aufruft WCF ausführt.That is because in this scenario, IIS performs Windows authentication prior to WCF invoking the custom authenticator.

    Weitere Informationen zum Erstellen einer WCF-Bindungselements finden Sie unter wie: Angeben einer Dienstbindung in einer Konfiguration.For more information about creating an WCF binding element, see How to: Specify a Service Binding in Configuration.

    Das folgende Beispiel zeigt den Konfigurationscode für die Bindung.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. Konfigurieren Sie ein Verhalten, das angibt, dass ein benutzerdefiniertes Benutzername- und Kennwort-Validierungssteuerelement verwendet wird, um Benutzernamen/Kennwort-Paare für eingehende UserNameSecurityToken-Sicherheitstoken zu überprüfen.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. Als untergeordnetes Element der <system.serviceModel > Element, Hinzufügen einer <Verhalten > Element.As a child to the <system.serviceModel> element, add a <behaviors> element.

    2. Hinzufügen einer <ServiceBehaviors > auf die <Verhalten > Element.Add a <serviceBehaviors> to the <behaviors> element.

    3. Hinzufügen einer <Verhalten > Element, und legen die name -Attribut auf einen geeigneten Wert.Add a <behavior> element and set the name attribute to an appropriate value.

    4. Hinzufügen einer <ServiceCredentials > auf die <Verhalten > Element.Add a <serviceCredentials> to the <behavior> element.

    5. Hinzufügen einer <UserNameAuthentication > auf die <ServiceCredentials >.Add a <userNameAuthentication> to the <serviceCredentials>.

    6. Legen Sie userNamePasswordValidationMode auf Custom festSet the userNamePasswordValidationMode to Custom.

      Wichtig

      Wenn die userNamePasswordValidationMode Wert nicht festgelegt ist, WCF verwendet Windows-Authentifizierung statt der benutzerdefinierten Benutzernamen- und Kennwort-Validierungssteuerelements.If the userNamePasswordValidationMode value is not set, WCF uses Windows authentication instead of the custom user name and password validator.

    7. Legen Sie den customUserNamePasswordValidatorType auf den Typ fest, der das benutzerdefinierte Benutzernamen- und Kennwort-Validierungssteuerelement darstellt.Set the customUserNamePasswordValidatorType to the type that represents your custom user name and password validator.

    Im folgenden Beispiel sehen Sie das <serviceCredentials>-Fragment bis zu diesem Punkt:The following example shows the <serviceCredentials> fragment to this point.

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

BeispielExample

Im folgenden Codebeispiel wird veranschaulicht, wie ein benutzerdefiniertes Benutzernamen- und Kennwort-Validierungssteuerelement erstellt wird.The following code example demonstrates how to create a custom user name and password validator. Verwenden Sie nicht den Code, der die Validate-Methode in einer Produktionsumgebung außer Kraft setzt.Do not use the code that overrides the Validate method in a production environment. Ersetzen Sie den Code mit dem benutzerdefinierten Benutzernamen- und Kennwort-Validierungsschema. Möglicherweise müssen der Benutzername und das zugehörige Kennwort aus einer Datenbank abgerufen werden.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

Siehe auchSee Also

UserNamePasswordValidator
Vorgehensweise: Verwenden des ASP.NET-MitgliedschaftsanbietersHow to: Use the ASP.NET Membership Provider
AuthentifizierungAuthentication