Exemplarische Vorgehensweise: Erstellen von benutzerdefinierten Client- und DienstanmeldeinformationenWalkthrough: Creating Custom Client and Service Credentials

In diesem Thema wird gezeigt, wie benutzerdefinierte Client- und Dienstanmeldeinformationen implementiert und benutzerdefinierte Anmeldeinformationen aus Anwendungscode genutzt werden.This topic shows how to implement custom client and service credentials and how to use custom credentials from application code.

Erweiterbarkeitsklassen für AnmeldeinformationenCredentials Extensibility Classes

Die ClientCredentials und ServiceCredentials Klassen sind die haupteinstiegspunkte für die Windows Communication Foundation (WCF)-sicherheitserweiterbarkeit.The ClientCredentials and ServiceCredentials classes are the main entry points to the Windows Communication Foundation (WCF) security extensibility. Diese Anmeldeinformationsklassen stellen die APIs bereit, die es dem Anmeldecode ermöglichen, Anmeldeinformationen einzurichten und Anmeldeinformationstypen in Sicherheitstoken zu konvertieren.These credentials classes provide the APIs that enable application code to set credentials information and to convert credential types into security tokens. (Sicherheitstoken verwendet, um die Anmeldeinformationen in SOAP-Nachrichten übertragen werden.) Die Verantwortungsbereiche dieser Klassen von Anmeldeinformationen können in zwei Bereiche geteilt werden:(Security tokens are the form used to transmit credential information inside SOAP messages.) The responsibilities of these credentials classes can be divided into two areas:

  • Bereitstellung der APIs für Anwendungen zur Einrichtung von Anmeldeinformationen.Provide the APIs for applications to set credentials information.

  • Funktion als Factory für SecurityTokenManager-Implementierungen.Perform as a factory for SecurityTokenManager implementations.

Sowohl die ClientCredentials- als auch die ServiceCredentials-Klasse erben von der abstrakten SecurityCredentialsManager-Klasse, die den Vertrag für die Rückgabe des SecurityTokenManager definieren.Both the ClientCredentials and the ServiceCredentials classes inherit from the abstract SecurityCredentialsManager class that defines the contract for returning the SecurityTokenManager.

Weitere Informationen zu den Clientanmeldeinformationen-Klassen und wie sie in der WCF-Sicherheitsarchitektur passen, finden Sie unter Sicherheitsarchitektur.For more information about the credentials classes and how they fit into the WCF security architecture, see Security Architecture.

In WCF bereitgestellten standardimplementierungen unterstützen die vom System bereitgestellten Anmeldeinformationstypen und erstellen einen Sicherheitstoken-Sicherheitstoken-Manager, die diese Anmeldeinformationstypen verarbeiten kann.The default implementations provided in WCF support the system-provided credential types and create a security token manager that is capable of handling those credentials types.

Gründe für eine AnpassungReasons to Customize

Es gibt mehrere Gründe für die Anpassung von Client- oder Dienstanmeldeinformationsklassen.There are multiple reasons for customizing either client or service credential classes. Allem ist die Anforderung zum Ändern des Standardverhaltens für die Sicherheit von WCF im Hinblick auf die Handhabung von vom System bereitgestellten Anmeldeinformationstypen, insbesondere aus folgenden Gründen:Foremost is the requirement to change the default WCF security behavior with regard to handling system-provided credential types, especially for the following reasons:

  • Änderungen, die mit anderen Erweiterbarkeitspunkten nicht möglich sind.Changes that are not possible using other extensibility points.

  • Hinzufügen neuer Anmeldeinformationstypen.Adding new credential types.

  • Hinzufügen neuer benutzerdefinierter Typen von Sicherheitstoken.Adding new custom security token types.

Dieses Thema beschreibt, wie benutzerdefinierte Client- und Dienstanmeldeinformationen implementiert und aus Anwendungscode genutzt werden.This topic describes how to implement custom client and service credentials and how to use them from application code.

ZuerstFirst in a Series

Erstellen einer benutzerdefinierten anmeldeinformationsklasse ist nur der erste Schritt, da der Grund für die Anpassung von Anmeldeinformationen WCF-Verhalten bezüglich der Bereitstellung von Anmeldeinformationen, die Serialisierung von Sicherheitstoken oder Authentifizierung zu ändern.Creating a custom credentials class is only the first step, because the reason for customizing credentials is to change WCF behavior regarding credentials provisioning, security token serialization, or authentication. Andere Themen in diesem Abschnitt beschreiben, wie benutzerdefinierte Serialisierungsprogramme und Authentifizierer erstellt werden.Other topics in this section describe how to create custom serializers and authenticators. In diesem Zusammenhang ist die Erstellung benutzerdefinierter Anmeldeinformationsklassen das erste Thema in der Reihe.In this regard, creating custom credential class is the first topic in the series. Nachfolgende Aktionen (Erstellung von benutzerdefinierten Serialisierungsprogrammen und Authentifizierern) können nur durchgeführt werden, nachdem benutzerdefinierte Anmeldeinformationen erstellt wurden.Subsequent actions (creating custom serializers and authenticators) can be done only after creating custom credentials. Weitere Themen, die auf diesem Thema aufbauen:Additional topics that build upon this topic include:

VerfahrenProcedures

So implementieren Sie benutzerdefinierte ClientanmeldeinformationenTo implement custom client credentials

  1. Definieren Sie eine neue von der ClientCredentials-Klasse abgeleitete Klasse.Define a new class derived from the ClientCredentials class.

  2. Dies ist optional.Optional. Fügen Sie Methoden oder Eigenschaften für neue Anmeldeinformationstypen hinzu.Add new methods or properties for new credential types. Wenn Sie keine neuen Anmeldeinformationstypen hinzufügen, können Sie diesen Schritt überspringen.If you do not add new credential types, skip this step. Im folgenden Beispiel wird eine CreditCardNumber-Eigenschaft hinzugefügt.The following example adds a CreditCardNumber property.

  3. Überschreiben Sie die CreateSecurityTokenManager-Methode.Override the CreateSecurityTokenManager method. Diese Methode wird automatisch von WCF-Sicherheitstokendienst-Infrastruktur aufgerufen, wenn die benutzerdefinierten Clientanmeldeinformationen verwendet wird.This method is automatically called by WCF security infrastructure when the custom client credential is used. Diese Methode ist für die Erstellung und die Rückgabe einer Implementierungsinstanz der SecurityTokenManager-Klasse verantwortlich.This method is responsible for creating and returning an instance of an implementation of the SecurityTokenManager class.

    Wichtig

    Wichtig: Beachten Sie, dass die CreateSecurityTokenManager-Methode überschrieben wird, um einen benutzerdefinierten Sicherheitstokenmanager zu erstellen.It is important to note that the CreateSecurityTokenManager method is overridden to create a custom security token manager. Der vom ClientCredentialsSecurityTokenManager abgeleitete Sicherheitstokenmanager muss einen benutzerdefinierten Sicherheitstokenanbieter zurückgeben, der vom SecurityTokenProvider abgeleitet wurde, um das eigentliche Sicherheitstoken zu erstellen.The security token manager, derived from ClientCredentialsSecurityTokenManager, must return a custom security token provider, derived from SecurityTokenProvider, to create the actual security token. Befolgen Sie nicht diese Vorgehensweise zur Erstellung von Sicherheitstokens, funktioniert die Anwendung möglicherweise nicht korrekt, wenn ChannelFactory-Objekte zwischengespeichert werden, was das standardmäßige Verhalten von WCF-Clientproxys ist. Dies kann ggf. einen Angriff durch Rechteerweiterung zur Folge haben.If you do not follow this pattern for creating security tokens, your application may function incorrectly when ChannelFactory objects are cached (which is the default behavior for WCF client proxies), potentially resulting in an elevation of privilege attack. Das benutzerdefinierte Anmeldedatenobjekt wird als Teil des ChannelFactory-Objekts zwischengespeichert.The custom credential object is cached as part of the ChannelFactory. Der benutzerdefinierte SecurityTokenManager wird jedoch bei jedem Aufruf erstellt. So lange die Tokenerstellungslogik also im SecurityTokenManager platziert wird, wird die Sicherheitsbedrohung abgewehrt.However, the custom SecurityTokenManager is created on every invocation, which mitigates the security threat as long as the token creation logic is placed in the SecurityTokenManager.

  4. Überschreiben Sie die CloneCore-Methode.Override the CloneCore method.

    public class MyClientCredentials : ClientCredentials
    {
        string creditCardNumber;
    
        public MyClientCredentials()
        {
            // Perform client credentials initialization.
        }
    
        protected MyClientCredentials(MyClientCredentials other)
            : base(other)
        {
            // Clone fields defined in this class.
            this.creditCardNumber = other.creditCardNumber;
        }
    
        public string CreditCardNumber
        {
            get
            {
                return this.creditCardNumber;
            }
            set
            {
                if (value == null)
                {
                    throw new ArgumentNullException("value");
                }
                this.creditCardNumber = value;
            }
        }
    
        public override SecurityTokenManager CreateSecurityTokenManager()
        {
            // Return your implementation of the SecurityTokenManager.
            return new MyClientCredentialsSecurityTokenManager(this);
        }
    
        protected override ClientCredentials CloneCore()
        {
            // Implement the cloning functionality.
            return new MyClientCredentials(this);
        }
    }
    
    Public Class MyClientCredentials
        Inherits ClientCredentials
        Private creditCardNumberValue As String
    
        Public Sub New() 
        
        End Sub 'New
        
        ' Perform client credentials initialization.    
        Protected Sub New(ByVal other As MyClientCredentials) 
            MyBase.New(other)
            ' Clone fields defined in this class.
            Me.creditCardNumberValue = other.creditCardNumberValue
        
        End Sub
    
        Public Property CreditCardNumber() As String 
            Get
                Return Me.creditCardNumberValue
            End Get
            Set
                If value Is Nothing Then
                    Throw New ArgumentNullException("value")
                End If
                Me.creditCardNumberValue = value
            End Set
        End Property
    
        Public Overrides Function CreateSecurityTokenManager() As SecurityTokenManager 
            ' Return your implementation of the SecurityTokenManager.
            Return New MyClientCredentialsSecurityTokenManager(Me)
        
        End Function
        
        Protected Overrides Function CloneCore() As ClientCredentials 
            ' Implement the cloning functionality.
            Return New MyClientCredentials(Me)
        
        End Function
    End Class
    

So implementieren Sie einen benutzerdefinierten Clientsicherheitstoken-ManagerTo implement a custom client security token manager

  1. Definieren Sie eine neue Klasse, die von ClientCredentialsSecurityTokenManager abgeleitet ist.Define a new class derived from ClientCredentialsSecurityTokenManager.

  2. Dies ist optional.Optional. Überschreiben Sie die CreateSecurityTokenProvider(SecurityTokenRequirement)-Methode, wenn eine benutzerdefinierte SecurityTokenProvider-Implementierung erstellt werden muss.Override the CreateSecurityTokenProvider(SecurityTokenRequirement) method if a custom SecurityTokenProvider implementation must be created. Weitere Informationen zu benutzerdefinierten Sicherheitstokenanbieter, finden Sie unter Vorgehensweise: Erstellen Sie einen benutzerdefinierten Sicherheitstokenanbieter.For more information about custom security token providers, see How to: Create a Custom Security Token Provider.

  3. Dies ist optional.Optional. Überschreiben Sie die CreateSecurityTokenAuthenticator(SecurityTokenRequirement, SecurityTokenResolver)-Methode, wenn eine benutzerdefinierte SecurityTokenAuthenticator-Implementierung erstellt werden muss.Override the CreateSecurityTokenAuthenticator(SecurityTokenRequirement, SecurityTokenResolver) method if a custom SecurityTokenAuthenticator implementation must be created. Weitere Informationen zu benutzerdefinierten Sicherheitstokenauthentifizierer, finden Sie unter Vorgehensweise: Erstellen eines benutzerdefinierten Sicherheitstokenauthentifizierers.For more information about custom security token authenticators, see How to: Create a Custom Security Token Authenticator.

  4. Dies ist optional.Optional. Überschreiben Sie die CreateSecurityTokenSerializer-Methode, wenn ein benutzerdefinierter SecurityTokenSerializer erstellt werden muss.Override the CreateSecurityTokenSerializer method if a custom SecurityTokenSerializer must be created. Weitere Informationen zu benutzerdefinierten Sicherheitstoken und benutzerdefinierten Sicherheitstoken-Serialisierungsprogramme, finden Sie unter Vorgehensweise: Erstellen eines benutzerdefinierten Tokens.For more information about custom security tokens and custom security token serializers, see How to: Create a Custom Token.

    internal class MyClientCredentialsSecurityTokenManager : 
        ClientCredentialsSecurityTokenManager
    {
        MyClientCredentials credentials;
    
        public MyClientCredentialsSecurityTokenManager(MyClientCredentials credentials)
            : base(credentials)
        {
            this.credentials = credentials;
        }
    
        public override SecurityTokenProvider CreateSecurityTokenProvider(
            SecurityTokenRequirement tokenRequirement)
        {
            // Return your implementation of the SecurityTokenProvider, if required.
            // This implementation delegates to the base class.
            return base.CreateSecurityTokenProvider(tokenRequirement);
        }
    
        public override SecurityTokenAuthenticator CreateSecurityTokenAuthenticator(
            SecurityTokenRequirement tokenRequirement, out SecurityTokenResolver outOfBandTokenResolver)
        {
            // Return your implementation of the SecurityTokenAuthenticator, if required.
            // This implementation delegates to the base class.
            return base.CreateSecurityTokenAuthenticator(tokenRequirement, out outOfBandTokenResolver);
        }
    
        public override SecurityTokenSerializer CreateSecurityTokenSerializer(SecurityTokenVersion version)
        {
            // Return your implementation of the SecurityTokenSerializer, if required.
            // This implementation delegates to the base class.
            return base.CreateSecurityTokenSerializer(version);
        }
    }
    
    
    Friend Class MyClientCredentialsSecurityTokenManager
        Inherits ClientCredentialsSecurityTokenManager
        Private credentials As MyClientCredentials
        
        
        Public Sub New(ByVal credentials As MyClientCredentials) 
            MyBase.New(credentials)
            Me.credentials = credentials
        
        End Sub
        
        
        Public Overrides Function CreateSecurityTokenProvider( _
        ByVal tokenRequirement As SecurityTokenRequirement) As SecurityTokenProvider
            ' Return your implementation of the SecurityTokenProvider, if required.
            ' This implementation delegates to the base class.
            Return MyBase.CreateSecurityTokenProvider(tokenRequirement)
    
        End Function
        
        
        Public Overrides Function CreateSecurityTokenAuthenticator( _
        ByVal tokenRequirement As SecurityTokenRequirement, _
        ByRef outOfBandTokenResolver As SecurityTokenResolver) As SecurityTokenAuthenticator
            ' Return your implementation of the SecurityTokenAuthenticator, if required.
            ' This implementation delegates to the base class.
            Return MyBase.CreateSecurityTokenAuthenticator(tokenRequirement, outOfBandTokenResolver)
    
        End Function
        
        
        Public Overrides Function CreateSecurityTokenSerializer(ByVal version As SecurityTokenVersion) _
        As SecurityTokenSerializer
            ' Return your implementation of the SecurityTokenSerializer, if required.
            ' This implementation delegates to the base class.
            Return MyBase.CreateSecurityTokenSerializer(version)
    
        End Function
    End Class
    

So verwenden Sie benutzerdefinierte Clientanmeldeinformationen aus AnwendungscodeTo use a custom client credentials from application code

  1. Erstellen Sie entweder eine Instanz des generierten Clients, die die Dienstschnittstelle darstellt, oder erstellen Sie eine Instanz der ChannelFactory, die auf den Dienst verweist, mit dem Sie kommunizieren möchten.Either create an instance of the generated client that represents the service interface, or create an instance of the ChannelFactory pointing to a service you want to communicate with.

  2. Entfernen Sie das vom System bereitgestellte Clientanmeldeinformationsverhalten aus der Behaviors-Sammlung, auf die von der Endpoint-Eigenschaft aus zugegriffen werden kann.Remove the system-provided client credentials behavior from the Behaviors collection, which can be accessed through the Endpoint property.

  3. Erstellen Sie eine neue Instanz einer benutzerdefinierten Clientanmeldeinformationsklasse, und fügen Sie diese zur Behaviors-Sammlung hinzu, auf die über die Endpoint-Eigenschaft zugegriffen werden kann.Create a new instance of a custom client credentials class and add it to the Behaviors collection, which can be accessed through the Endpoint property.

    // Create a client with the client endpoint configuration.
    CalculatorClient client = new CalculatorClient();
    
    // Remove the ClientCredentials behavior.
    client.ChannelFactory.Endpoint.Behaviors.Remove<ClientCredentials>();
    
    // Add a custom client credentials instance to the behaviors collection.
    client.ChannelFactory.Endpoint.Behaviors.Add(new MyClientCredentials());
    
    ' Create a client with the client endpoint configuration.
    Dim client As New CalculatorClient()
    
    ' Remove the ClientCredentials behavior.
    client.ChannelFactory.Endpoint.Behaviors.Remove(Of ClientCredentials)()
    
    ' Add a custom client credentials instance to the behaviors collection.
    client.ChannelFactory.Endpoint.Behaviors.Add(New MyClientCredentials())
    

Die oben beschriebene Prozedur zeigt, wie Clientanmeldeinformationen aus dem Anwendungscode genutzt werden können.The previous procedure shows how to use client credentials from application code. WCF-Anmeldeinformationen können auch in der Anwendungskonfigurationsdatei konfiguriert werden.WCF credentials can also be configured using the application configuration file. Die Nutzung der Anwendungskonfiguration ist in vielen Fällen einer harten Codierung vorzuziehen, da hier eine Änderung der Anwendungsparameter ermöglicht wird, ohne dass ein Ändern der Quelle oder eine Neukompilierung und Neubereitstellung erforderlich sind.Using application configuration is often preferable to hard-coding because it enables modification of application parameters without having to modify the source, recompiling, and redeployment.

Die nächste Prozedur beschreibt, wie eine Unterstützung für die Konfiguration von benutzerdefinierten Anmeldeinformationen erstellt wird.The next procedure describes how to provide support for configuration of custom credentials.

Erstellen eines Konfigurationshandlers für benutzerdefinierte ClientanmeldeinformationenCreating a configuration handler for custom client credentials

  1. Definieren Sie eine neue Klasse, die von ClientCredentialsElement abgeleitet ist.Define a new class derived from ClientCredentialsElement.

  2. Dies ist optional.Optional. Fügen Sie Eigenschaften für alle zusätzlichen Konfigurationsparameter hinzu, die Sie durch Anwendungskonfiguration verfügbar machen möchten.Add properties for all additional configuration parameters that you want to expose through application configuration. Im unten angegebenen Beispiel wird eine Eigenschaft mit dem Namen CreditCardNumber hinzugefügt.The example below adds one property named CreditCardNumber.

  3. Überschreiben Sie die BehaviorType-Eigenschaft, um den Typ der benutzerdefinierten Clienanmeldeinformationsklasse zurückzugeben, der mithilfe des Konfigurationselements erstellt wurde.Override the BehaviorType property to return the type of the custom client credentials class created with the configuration element.

  4. Überschreiben Sie die CreateBehavior-Methode.Override the CreateBehavior method. Die Methode ist basierend auf den von der Konfigurationsdatei geladenen Einstellungen für die Erstellung und Rückgabe einer Instanz der benutzerdefinierten Anmeldeinformationsklasse verantwortlich.The method is responsible for creating and returning an instance of the custom credential class based on the settings loaded from the configuration file. Rufen Sie die grundlegende ApplyConfiguration(ClientCredentials)-Methode von dieser Methode auf, um die vom System bereitgestellten Anmeldeinformationseinstellungen abzurufen, die in Ihre benutzerdefinierte Clientanmeldeinformationsinstanz geladen sind.Call the base ApplyConfiguration(ClientCredentials) method from this method to retrieve the system-provided credentials settings loaded into your custom client credentials instance.

  5. Dies ist optional.Optional. Wenn Sie in Schritt 2 zusätzliche Eigenschaften hinzugefügt haben, müssen Sie die Properties-Eigenschaft zum Registrieren Ihrer zusätzlichen Konfigurationseinstellungen überschreiben, damit der Konfigurationsframework diese erkennt.If you added additional properties in step 2, you need to override the Properties property in order to register your additional configuration settings for the configuration framework to recognize them. Kombinieren Sie Ihre Eigenschaften mit den grundlegenden Klasseneigenschaften, um zu ermöglichen, dass die vom System bereitgestellten Einstellungen über das Konfigurationselement dieser benutzerdefinierten Clientanmeldeinformationen konfiguriert werden können.Combine your properties with the base class properties to allow the system-provided settings to be configured through this custom client credentials configuration element.

    public class MyClientCredentialsConfigHandler : ClientCredentialsElement
    {
        ConfigurationPropertyCollection properties;
    
        public override Type BehaviorType
        {
            get { return typeof(MyClientCredentials); }
        }
    
        public string CreditCardNumber
        {
            get { return (string)base["creditCardNumber"]; }
            set
            {
                if (String.IsNullOrEmpty(value))
                {
                    value = String.Empty;
                }
                base["creditCardNumber"] = value;
            }
        }
    
        protected override ConfigurationPropertyCollection Properties
        {
            get
            {
                if (this.properties == null)
                {
                    ConfigurationPropertyCollection properties = base.Properties;
                    properties.Add(new ConfigurationProperty(
                        "creditCardNumber", 
                        typeof(System.String), 
                        string.Empty,
                        null, 
                        new StringValidator(0, 32, null), 
                        ConfigurationPropertyOptions.None));
                    this.properties = properties;
                }
                return this.properties;
            }
        }
    
        protected override object CreateBehavior()
        {
            MyClientCredentials creds = new MyClientCredentials();
            creds.CreditCardNumber = CreditCardNumber;
            base.ApplyConfiguration(creds);
            return creds;
        }
    }
    
    
    Public Class MyClientCredentialsConfigHandler
        Inherits ClientCredentialsElement
        Private propertiesValue As ConfigurationPropertyCollection
        
        
        Public Overrides ReadOnly Property BehaviorType() As Type 
            Get
                Return GetType(MyClientCredentials)
            End Get
        End Property 
        
        Public Property CreditCardNumber() As String 
            Get
                Return CStr(MyBase.Item("creditCardNumber"))
            End Get
            Set
                If String.IsNullOrEmpty(value) Then
                    value = String.Empty
                End If
                MyBase.Item("creditCardNumber") = value
            End Set
        End Property
        
        
        Protected Overrides ReadOnly Property Properties() As ConfigurationPropertyCollection 
            Get
                If Me.propertiesValue Is Nothing Then
                    Dim myProperties As ConfigurationPropertyCollection = MyBase.Properties
                    myProperties.Add(New ConfigurationProperty( _
                    "creditCardNumber", _
                    GetType(System.String), _
                    String.Empty, _
                    Nothing, _
                    New StringValidator(0, 32, Nothing), _
                    ConfigurationPropertyOptions.None))
                    Me.propertiesValue = myProperties
                End If
                Return Me.propertiesValue
            End Get
        End Property
        
        
        Protected Overrides Function CreateBehavior() As Object 
            Dim creds As New MyClientCredentials()
            creds.CreditCardNumber = Me.CreditCardNumber
            MyBase.ApplyConfiguration(creds)
            Return creds
        
        End Function
    End Class
    

Nachdem Sie die konfigurationshandlerklasse besitzen, können sie in der WCF-Konfiguration-Framework integriert werden.Once you have the configuration handler class, it can be integrated into the WCF configuration framework. Dies ermöglicht die Verwendung benutzerdefinierter Clientanmeldeinformationen in den Clientendpunktverhaltenselementen, wie in der nächsten Prozedur gezeigt wird.That enables the custom client credentials to be used in the client endpoint behavior elements, as shown in the next procedure.

Registrieren und Verwenden eines benutzerdefinierten Clientanmeldeinformationen-Konfigurationshandlers in der AnwendungskonfigurationTo register and use a custom client credentials configuration handler in the application configuration

  1. Hinzufügen einer <extensions>-Element und ein <behaviorExtensions>-Element zur Konfigurationsdatei.Add an <extensions> element and a <behaviorExtensions> element to the configuration file.

  2. Hinzufügen einer <add>-Elements auf der <behaviorExtensions> Element, und legen die name -Attribut auf einen geeigneten Wert.Add an <add> element to the <behaviorExtensions> element and set the name attribute to an appropriate value.

  3. Legen Sie das type-Attribut auf den vollqualifizierten Typnamen fest.Set the type attribute to the fully-qualified type name. Binden Sie ebenfalls den Assemblynamen und andere Assemblyattribute ein.Also include the assembly name and other assembly attributes.

    <system.serviceModel>  
      <extensions>  
        <behaviorExtensions>  
          <add name="myClientCredentials" type="Microsoft.ServiceModel.Samples.MyClientCredentialsConfigHandler, CustomCredentials, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />  
        </behaviorExtensions>  
      </extensions>  
    <system.serviceModel>  
    
  4. Nach dem Registrieren der Konfigurationshandler, die das benutzerdefinierte Anmeldeinformationen Element genutzt werden, innerhalb der gleichen Konfigurationsdatei anstatt vom System bereitgestellte <clientCredentials> Element.After registering your configuration handler, the custom credentials element can be used inside the same configuration file instead of the system-provided <clientCredentials> element. Sie können sowohl die vom System bereitgestellten Eigenschaften als auch neue Eigenschaften verwenden, die Sie in Ihre Konfigurationshandlerimplementierung eingefügt haben.You can use both the system-provided properties and any new properties that you have added to your configuration handler implementation. Im folgenden Beispiel wird der Wert einer benutzerdefinierten Eigenschaft mithilfe des creditCardNumber-Attributs eingerichtet.The following example sets the value of a custom property using the creditCardNumber attribute.

    <behaviors>  
      <endpointBehaviors>  
        <behavior name="myClientCredentialsBehavior">  
          <myClientCredentials creditCardNumber="123-123-123"/>  
        </behavior>  
      </endpointBehaviors>  
    </behaviors>  
    

So implementieren Sie benutzerdefinierte DienstanmeldeinformationenTo implement custom service credentials

  1. Definieren Sie eine neue Klasse, die von ServiceCredentials abgeleitet ist.Define a new class derived from ServiceCredentials.

  2. Dies ist optional.Optional. Fügen Sie neue Eigenschaften hinzu, um APIs für neue Werte für die Anmeldeinformationen bereitzustellen, die hinzugefügt werden.Add new properties to provide APIs for new credential values that are being added. Wenn Sie keine neuen Anmeldeinformationswerte hinzufügen, können Sie diesen Schritt überspringen.If you do not add new credential values, skip this step. Im folgenden Beispiel wird die AdditionalCertificate-Eigenschaft hinzugefügt.The following example adds an AdditionalCertificate property.

  3. Überschreiben Sie die CreateSecurityTokenManager-Methode.Override the CreateSecurityTokenManager method. Diese Methode wird automatisch von der WCF-Infrastruktur aufgerufen, wenn die benutzerdefinierten Clientanmeldeinformationen verwendet wird.This method is automatically called by the WCF infrastructure when the custom client credential is used. Die Methode ist für die Erstellung und die Rückgabe einer Implementierungsinstanz der SecurityTokenManager-Klasse verantwortlich (wie in der nächsten Prozedur beschrieben).The method is responsible for creating and returning an instance of an implementation of the SecurityTokenManager class (described in the next procedure).

  4. Dies ist optional.Optional. Überschreiben Sie die CloneCore-Methode.Override the CloneCore method. Dies ist nur erforderlich, wenn neue Eigenschaften oder interne Felder zur benutzerdefinierten Clientanmeldeinformationsimplementierung hinzugefügt werden.This is required only if adding new properties or internal fields to the custom client credentials implementation.

    public class MyServiceCredentials : ServiceCredentials
    {
        X509Certificate2 additionalCertificate;
    
        public MyServiceCredentials()
        {
        }
    
        protected MyServiceCredentials(MyServiceCredentials other)
            : base(other)
        {
            this.additionalCertificate = other.additionalCertificate;
        }
    
        public X509Certificate2 AdditionalCertificate
        {
            get
            {
                return this.additionalCertificate;
            }
            set
            {
                if (value == null)
                {
                    throw new ArgumentNullException("value");
                }
                this.additionalCertificate = value;
            }
        }
    
        public override SecurityTokenManager CreateSecurityTokenManager()
        {
            return base.CreateSecurityTokenManager();
        }
    
        protected override ServiceCredentials CloneCore()
        {
            return new MyServiceCredentials(this);
        }
    }
    
    Public Class MyServiceCredentials
        Inherits ServiceCredentials
        Private additionalCertificateValue As X509Certificate2
    
        Public Sub New() 
        
        End Sub
    
        Protected Sub New(ByVal other As MyServiceCredentials) 
            MyBase.New(other)
            Me.additionalCertificate = other.additionalCertificate
        End Sub
        
        
        Public Property AdditionalCertificate() As X509Certificate2 
            Get
                Return Me.additionalCertificateValue
            End Get
            Set
                If value Is Nothing Then
                    Throw New ArgumentNullException("value")
                End If
                Me.additionalCertificateValue = value
            End Set
        End Property
    
        Public Overrides Function CreateSecurityTokenManager() As SecurityTokenManager 
            Return MyBase.CreateSecurityTokenManager()
        
        End Function
        
        
        Protected Overrides Function CloneCore() As ServiceCredentials 
            Return New MyServiceCredentials(Me)
        
        End Function
    End Class
    

So implementieren Sie einen benutzerdefinierten Dienstsicherheitstoken-ManagerTo implement a custom service security token manager

  1. Definieren Sie eine neue von der ServiceCredentialsSecurityTokenManager-Klasse abgeleitete Klasse.Define a new class derived from the ServiceCredentialsSecurityTokenManager class.

  2. Dies ist optional.Optional. Überschreiben Sie die CreateSecurityTokenProvider-Methode, wenn eine benutzerdefinierte SecurityTokenProvider-Implementierung erstellt werden muss.Override the CreateSecurityTokenProvider method if a custom SecurityTokenProvider implementation must be created. Weitere Informationen zu benutzerdefinierten Sicherheitstokenanbieter, finden Sie unter Vorgehensweise: Erstellen Sie einen benutzerdefinierten Sicherheitstokenanbieter.For more information about custom security token providers, see How to: Create a Custom Security Token Provider.

  3. Dies ist optional.Optional. Überschreiben Sie die CreateSecurityTokenAuthenticator-Methode, wenn eine benutzerdefinierte SecurityTokenAuthenticator-Implementierung erstellt werden muss.Override the CreateSecurityTokenAuthenticator method if a custom SecurityTokenAuthenticator implementation must be created. Weitere Informationen zu benutzerdefinierten Sicherheitstokenauthentifizierer, finden Sie unter Vorgehensweise: Erstellen eines benutzerdefinierten Sicherheitstokenauthentifizierers Thema.For more information about custom security token authenticators, see How to: Create a Custom Security Token Authenticator topic.

  4. Dies ist optional.Optional. Überschreiben Sie die CreateSecurityTokenSerializer(SecurityTokenVersion)-Methode, wenn ein benutzerdefinierter SecurityTokenSerializer erstellt werden muss.Override the CreateSecurityTokenSerializer(SecurityTokenVersion) method if a custom SecurityTokenSerializer must be created. Weitere Informationen zu benutzerdefinierten Sicherheitstoken und benutzerdefinierten Sicherheitstoken-Serialisierungsprogramme, finden Sie unter Vorgehensweise: Erstellen eines benutzerdefinierten Tokens.For more information about custom security tokens and custom security token serializers, see How to: Create a Custom Token.

    internal class MyServiceCredentialsSecurityTokenManager : 
        ServiceCredentialsSecurityTokenManager
    {
        MyServiceCredentials credentials;
    
        public MyServiceCredentialsSecurityTokenManager(MyServiceCredentials credentials)
            : base(credentials)
        {
            this.credentials = credentials;
        }
    
        public override SecurityTokenProvider CreateSecurityTokenProvider(SecurityTokenRequirement tokenRequirement)
        {
            // Return your implementation of SecurityTokenProvider, if required.
            // This implementation delegates to the base class.
            return base.CreateSecurityTokenProvider(tokenRequirement);
        }
    
        public override SecurityTokenAuthenticator CreateSecurityTokenAuthenticator(SecurityTokenRequirement tokenRequirement, out SecurityTokenResolver outOfBandTokenResolver)
        {
            // Return your implementation of SecurityTokenProvider, if required.
            // This implementation delegates to the base class.
            return base.CreateSecurityTokenAuthenticator(tokenRequirement, out outOfBandTokenResolver);
        }
    
        public override SecurityTokenSerializer CreateSecurityTokenSerializer(SecurityTokenVersion version)
        {
            // Return your implementation of SecurityTokenProvider, if required.
            // This implementation delegates to the base class.
            return base.CreateSecurityTokenSerializer(version);
        }
    }
    
    Friend Class MyServiceCredentialsSecurityTokenManager
        Inherits ServiceCredentialsSecurityTokenManager
        Private credentials As MyServiceCredentials
    
        Public Sub New(ByVal credentials As MyServiceCredentials) 
            MyBase.New(credentials)
            Me.credentials = credentials
        
        End Sub 'New
        
        
        Public Overrides Function CreateSecurityTokenProvider(ByVal tokenRequirement As SecurityTokenRequirement) _
        As SecurityTokenProvider
            ' Return your implementation of SecurityTokenProvider, if required.
            ' This implementation delegates to the base class.
            Return MyBase.CreateSecurityTokenProvider(tokenRequirement)
    
        End Function
    
        Public Overrides Function CreateSecurityTokenAuthenticator( _
        ByVal tokenRequirement As SecurityTokenRequirement, _
        ByRef outOfBandTokenResolver As SecurityTokenResolver) _
        As SecurityTokenAuthenticator
            ' Return your implementation of SecurityTokenProvider, if required.
            ' This implementation delegates to the base class.
            Return MyBase.CreateSecurityTokenAuthenticator(tokenRequirement, outOfBandTokenResolver)
    
        End Function
        
        
        Public Overrides Function CreateSecurityTokenSerializer(ByVal version As SecurityTokenVersion) _
        As SecurityTokenSerializer
            ' Return your implementation of SecurityTokenProvider, if required.
            ' This implementation delegates to the base class.
            Return MyBase.CreateSecurityTokenSerializer(version)
    
        End Function
    End Class
    

So verwenden Sie benutzerdefinierte Dienstanmeldeinformationen aus AnwendungscodeTo use custom service credentials from application code

  1. Erstellen Sie eine Instanz von ServiceHost.Create an instance of the ServiceHost.

  2. Entfernen Sie das vom System bereitgestellte Dienstanmeldeinformationsverhalten aus der Behaviors-Sammlung.Remove the system-provided service credentials behavior from the Behaviors collection.

  3. Erstellen Sie eine neue Instanz der benutzerdefinierten Dienstanmeldeinformationsklasse, und fügen Sie diese der Behaviors-Sammlung hinzu.Create a new instance of the custom service credentials class and add it to the Behaviors collection.

    // Create a service host with a service type.
    ServiceHost serviceHost = new ServiceHost(typeof(Service));
    
    // Remove the default ServiceCredentials behavior.
    serviceHost.Description.Behaviors.Remove<ServiceCredentials>();
    
    // Add a custom service credentials instance to the collection.
    serviceHost.Description.Behaviors.Add(new MyServiceCredentials());
    
    ' Create a service host with a service type.
    Dim serviceHost As New ServiceHost(GetType(Service))
    
    ' Remove the default ServiceCredentials behavior.
    serviceHost.Description.Behaviors.Remove(Of ServiceCredentials)()
    
    ' Add a custom service credentials instance to the collection.
    serviceHost.Description.Behaviors.Add(New MyServiceCredentials())
    

Fügen Sie anhand der in den Prozeduren "To create a configuration handler for custom client credentials" und "To register and use a custom client credentials configuration handler in the application configuration" bereits beschriebenen Schritte die Unterstützung für Konfiguration hinzu. Der einzige Unterschied liegt in der Verwendung der ServiceCredentialsElement-Klasse anstelle der ClientCredentialsElement-Klasse als Basisklasse für den Konfigurationshandler.Add support for configuration using the steps described previously in the procedures "To create a configuration handler for custom client credentials" and "To register and use a custom client credentials configuration handler in the application configuration." The only difference is to use the ServiceCredentialsElement class instead of the ClientCredentialsElement class as a base class for the configuration handler. Das benutzerdefinierte Dienstanmeldeinformationselement kann immer verwendet werden, wenn das vom System bereitgestellte <serviceCredentials>-Element genutzt wird.The custom service credential element can then be used wherever the system-provided <serviceCredentials> element is used.

Siehe auchSee Also

ClientCredentials
ServiceCredentials
SecurityCredentialsManager
SecurityTokenManager
ClientCredentialsElement
ServiceCredentialsElement
Vorgehensweise: Erstellen eines benutzerdefinierten SicherheitstokenanbietersHow to: Create a Custom Security Token Provider
Vorgehensweise: Erstellen eines benutzerdefinierten SicherheitstokenauthentifizierersHow to: Create a Custom Security Token Authenticator
Vorgehensweise: Erstellen eines benutzerdefinierten TokensHow to: Create a Custom Token