Vorgehensweise: Verwenden eines benutzerdefinierten Benutzernamens und eines Kennwort-Validierungssteuerelements

Wenn ein Benutzername und ein Kennwort für die Authentifizierung verwendet werden, verwendet Windows Communication Foundation (WCF) standardmäßig Windows zum Überprüfen des Benutzernamens und des Kennworts.WCF ermöglich jedoch benutzerdefinierte Benutzernamen- und Kennwortauthentifizierungsschemas, die auch Validierungssteuerelemente genannt werden.Zum Verwenden eines benutzerdefinierten Benutzernamen- und Kennwort-Validierungssteuerelements erstellen und konfigurieren Sie eine Klasse, die sich von UserNamePasswordValidator ableitet.

Eine Beispielanwendung finden Sie unter Benutzernamen- und Kennwort-Validierungssteuerelement.

So erstellen Sie ein benutzerdefiniertes Benutzernamen- und Kennwort-Validierungssteuerelement

  1. Erstellen Sie eine von der UserNamePasswordValidator-Klasse abgeleitete Klasse.

    
    public class CustomUserNameValidator : UserNamePasswordValidator
    {
    
    Public Class CustomUserNameValidator
        Inherits UserNamePasswordValidator
    
  2. Implementieren Sie ein benutzerdefiniertes Authentifizierungsschema, indem Sie die Validate-Methode außer Kraft setzen.

    Verwenden Sie nicht den Code des folgenden Beispiels, der die Validate-Methode in einer Produktionsumgebung außer Kraft setzt.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.

    Um Authentifizierungsfehler an den Client zurückzugeben, lösen Sie in der Validate-Methode eine FaultException aus.

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

  1. Konfigurieren Sie eine Bindung, die Nachrichtensicherheit über jedes beliebige Transportprotokoll oder Sicherheit auf Transportebene über HTTP(S) verwendet.

    Bei Verwendung von Nachrichtensicherheit fügen Sie eine der vom System bereitgestellten Bindungen hinzu, beispielsweise <wsHttpBinding>, oder ein <customBinding>, das Nachrichtensicherheit und den Anmeldeinformationstyp UserName unterstützt.

    Wenn Sie Sicherheit auf Transportebene über HTTP(S) verwenden, fügen Sie entweder das <wsHttpBinding> oder das <basicHttpBinding> hinzu oder ein <netTcpBinding> oder ein <customBinding> das mit HTTP(S) und dem Authentifizierungsschema Basic arbeitet.

    Hinweis

    Wenn Sie .NET Framework Version 3.5 oder höher verwenden, können Sie ein benutzerdefiniertes Benutzernamen- und Kennwort-Validierungssteuerelement mit Nachrichten- und Transportsicherheit nutzen.In Verbindung mit WinFX kann ein benutzerdefiniertes Benutzername- und Kennwort-Validierungssteuerelement nur mit Nachrichtensicherheit verwendet werden.

    Tipp

    Weitere Informationen zur Verwendung von <netTcpBinding> in diesem Kontext finden Sie unter <Sicherheit>

    1. Fügen Sie in der Konfigurationsdatei unterhalb des <system.serviceModel>-Elements ein <Bindungen>-Element ein.

    2. Fügen Sie dem Bindungsabschnitt ein <wsHttpBinding>-Element oder <basicHttpBinding>-Element hinzu.Weitere Informationen finden Sie unter zum Erstellen eines WCF-Bindungselements finden Sie unter Vorgehensweise: Angeben einer Dienstbindung in einer Konfiguration.

    3. Legen Sie das mode-Attribut für das <Sicherheit> oder <Sicherheit>Message``Transport auf or, TransportWithMessageCredential, fest.

    4. Legen Sie das clientCredentialType-Attribut des <message> oder des <transport> fest.

      Bei Verwendung von Nachrichtensicherheit legen Sie das clientCredentialType-Attribute des <message> auf UserNamefest.

      Wenn Sicherheit auf Transportebene über HTTP(S) verwendet wird, legen Sie das clientCredentialType-Attribut des <transport><transport>Basic oder auf fest.

      Hinweis

      Wenn ein WCF-Dienst in Internet Information Services (IIS) unter Verwendung von Sicherheit auf Transportebene gehostet wird und die UserNamePasswordValidationMode-Eigenschaft auf UserNamePasswordValidationMode festgelegt ist, dann verwendet das benutzerdefinierte Authentifizierungsschema eine Teilmenge der Windows-Authentifizierung.Das liegt daran, dass IIS in diesem Szenario die Windows-Authentifizierung ausführt, bevor WCF den benutzerdefinierten Authentifizierer aufruft

    Weitere Informationen finden Sie unter zum Erstellen eines WCF-Bindungselements finden Sie unter Vorgehensweise: Angeben einer Dienstbindung in einer Konfiguration.

    Das folgende Beispiel zeigt den Konfigurationscode für die Bindung.

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

    1. Fügen Sie ein <system.serviceModel><Verhalten>-Elements hinzu.

    2. Fügen Sie dem <Verhalten>-Element ein <serviceBehaviors>-Element hinzu.

    3. Fügen Sie ein <Verhalten>name-Element hinzu, und legen Sie das -Attribut auf einen passenden Wert fest.

    4. Fügen Sie dem <serviceCredentials>-Element ein <Verhalten>-Element hinzu.

    5. Fügen Sie ein <userNameAuthentication> zum <serviceCredentials> hinzu.

    6. Legen Sie den userNamePasswordValidationMode auf Custom fest.

      Wichtig

      Wenn der userNamePasswordValidationMode-Wert nicht festgelegt wird, verwendet WCF die Windows-Authentifizierung anstatt des benutzerdefinierten Benutzernamen- und Kennwort-Validierungssteuerelements.

    7. Legen Sie den customUserNamePasswordValidatorType auf den Typ fest, der das benutzerdefinierte Benutzernamen- und Kennwort-Validierungssteuerelement darstellt.

    Im folgenden Beispiel sehen Sie das <serviceCredentials>-Fragment bis zu diesem Punkt:

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

Beispiel

Im folgenden Codebeispiel wird veranschaulicht, wie ein benutzerdefiniertes Benutzernamen- und Kennwort-Validierungssteuerelement erstellt wird.Verwenden Sie nicht den Code, der die Validate-Methode in einer Produktionsumgebung außer Kraft setzt.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.

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 auch

UserNamePasswordValidator
Gewusst wie: Verwenden des ASP.NET-Mitgliedschaftsanbieters
Authentifizierung