Udostępnij za pośrednictwem


Wskazówki: Tworzenie niestandardowego klienta i poświadczeń usługi

W tym temacie pokazano, jak zaimplementować niestandardowe poświadczenia klienta i usługi oraz jak używać poświadczeń niestandardowych z kodu aplikacji.

Klasy rozszerzalności poświadczeń

Klasy ClientCredentials i ServiceCredentials to główne punkty wejścia do rozszerzalności zabezpieczeń programu Windows Communication Foundation (WCF). Te klasy poświadczeń udostępniają interfejsy API, które umożliwiają kodowi aplikacji ustawianie informacji o poświadczeniach i konwertowanie typów poświadczeń na tokeny zabezpieczające. (Tokeny zabezpieczające to formularz używany do przesyłania informacji o poświadczeniach wewnątrz komunikatów protokołu SOAP). Obowiązki tych klas poświadczeń można podzielić na dwa obszary:

  • Podaj interfejsy API dla aplikacji, aby ustawić informacje o poświadczeniach.

  • Wykonaj jako fabrykę implementacji SecurityTokenManager .

Domyślne implementacje udostępniane w programie WCF obsługują typy poświadczeń dostarczonych przez system i tworzą menedżera tokenów zabezpieczających, który może obsługiwać te typy poświadczeń.

Powody dostosowywania

Istnieje wiele powodów dostosowywania klas poświadczeń klienta lub usługi. Przede wszystkim wymaganie zmiany domyślnego zachowania zabezpieczeń WCF w odniesieniu do obsługi typów poświadczeń dostarczanych przez system, szczególnie z następujących powodów:

  • Zmiany, które nie są możliwe przy użyciu innych punktów rozszerzalności.

  • Dodawanie nowych typów poświadczeń.

  • Dodawanie nowych niestandardowych typów tokenów zabezpieczających.

W tym temacie opisano sposób implementowania niestandardowych poświadczeń klienta i usługi oraz sposobu ich używania z kodu aplikacji.

Pierwszy w serii

Tworzenie niestandardowej klasy poświadczeń jest tylko pierwszym krokiem, ponieważ powodem dostosowywania poświadczeń jest zmiana zachowania usługi WCF w zakresie aprowizacji poświadczeń, serializacji tokenu zabezpieczającego lub uwierzytelniania. Inne tematy w tej sekcji opisują sposób tworzenia niestandardowych serializatorów i wystawców uwierzytelnień. W związku z tym tworzenie niestandardowej klasy poświadczeń jest pierwszym tematem w serii. Kolejne akcje (tworzenie niestandardowych serializatorów i wystawców uwierzytelniania) można wykonać tylko po utworzeniu poświadczeń niestandardowych. Dodatkowe tematy, które opierają się na tym temacie, obejmują:

Procedury

Aby zaimplementować niestandardowe poświadczenia klienta

  1. Zdefiniuj nową klasę pochodzącą ClientCredentials z klasy .

  2. Opcjonalny. Dodaj nowe metody lub właściwości dla nowych typów poświadczeń. Jeśli nie dodasz nowych typów poświadczeń, pomiń ten krok. Poniższy przykład dodaje CreditCardNumber właściwość.

  3. Zastąpij metodę CreateSecurityTokenManager . Ta metoda jest wywoływana automatycznie przez infrastrukturę zabezpieczeń WCF, gdy używane jest niestandardowe poświadczenie klienta. Ta metoda jest odpowiedzialna za tworzenie i zwracanie wystąpienia implementacji SecurityTokenManager klasy.

    Ważne

    Należy pamiętać, że CreateSecurityTokenManager metoda jest zastępowana w celu utworzenia niestandardowego menedżera tokenów zabezpieczających. Menedżer tokenów zabezpieczających pochodzący z ClientCredentialsSecurityTokenManagerprogramu musi zwrócić niestandardowego dostawcę tokenu zabezpieczającego pochodzącego z SecurityTokenProviderprogramu , aby utworzyć rzeczywisty token zabezpieczający. Jeśli nie stosujesz tego wzorca do tworzenia tokenów zabezpieczających, aplikacja może działać niepoprawnie, gdy ChannelFactory obiekty są buforowane (co jest domyślnym zachowaniem serwerów proxy klienta WCF), co może spowodować atak na podniesienie uprawnień. Obiekt poświadczeń niestandardowych jest buforowany w ramach elementu ChannelFactory. Jednak niestandardowy SecurityTokenManager jest tworzony przy każdym wywołaniu, co ogranicza zagrożenie bezpieczeństwa, o ile logika tworzenia tokenu SecurityTokenManagerjest umieszczana w obiekcie .

  4. Zastąpij metodę CloneCore .

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

Aby zaimplementować niestandardowego menedżera tokenów zabezpieczających klienta

  1. Zdefiniuj nową klasę pochodzącą z klasy ClientCredentialsSecurityTokenManager.

  2. Opcjonalny. Zastąpi metodę CreateSecurityTokenProvider(SecurityTokenRequirement) , jeśli należy utworzyć niestandardową SecurityTokenProvider implementację. Aby uzyskać więcej informacji na temat niestandardowych dostawców tokenów zabezpieczających, zobacz How to: Create a Custom Security Token Provider (Instrukcje: tworzenie niestandardowego dostawcy tokenów zabezpieczających).

  3. Opcjonalny. Zastąpi metodę CreateSecurityTokenAuthenticator(SecurityTokenRequirement, SecurityTokenResolver) , jeśli należy utworzyć niestandardową SecurityTokenAuthenticator implementację. Aby uzyskać więcej informacji na temat niestandardowych wystawców uwierzytelnień tokenów zabezpieczających, zobacz How to: Create a Custom Security Token Authenticator (Instrukcje: tworzenie niestandardowego wystawcy uwierzytelniania tokenu zabezpieczającego).

  4. Opcjonalny. Zastąpi metodę CreateSecurityTokenSerializer , jeśli należy utworzyć niestandardową SecurityTokenSerializer . Aby uzyskać więcej informacji o niestandardowych tokenach zabezpieczających i niestandardowych serializatorach tokenów zabezpieczających, zobacz Instrukcje: tworzenie tokenu niestandardowego.

    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
    

Aby użyć niestandardowych poświadczeń klienta z kodu aplikacji

  1. Utwórz wystąpienie wygenerowanego klienta reprezentującego interfejs usługi lub utwórz wystąpienie wskazujące ChannelFactory usługę, z którą chcesz się komunikować.

  2. Usuń zachowanie poświadczeń klienta dostarczone przez system z Behaviors kolekcji, do której można uzyskać dostęp za pośrednictwem Endpoint właściwości .

  3. Utwórz nowe wystąpienie niestandardowej klasy poświadczeń klienta i dodaj je do Behaviors kolekcji, do której można uzyskać dostęp za pośrednictwem Endpoint właściwości .

    // 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())
    

W poprzedniej procedurze pokazano, jak używać poświadczeń klienta z kodu aplikacji. Poświadczenia programu WCF można również skonfigurować przy użyciu pliku konfiguracji aplikacji. Korzystanie z konfiguracji aplikacji jest często preferowane do kodowania na stałe, ponieważ umożliwia modyfikowanie parametrów aplikacji bez konieczności modyfikowania źródła, ponownego komplikowania i ponownego wdrażania.

W następnej procedurze opisano sposób zapewniania obsługi konfiguracji poświadczeń niestandardowych.

Tworzenie procedury obsługi konfiguracji dla niestandardowych poświadczeń klienta

  1. Zdefiniuj nową klasę pochodzącą z klasy ClientCredentialsElement.

  2. Opcjonalny. Dodaj właściwości dla wszystkich dodatkowych parametrów konfiguracji, które chcesz uwidocznić za pośrednictwem konfiguracji aplikacji. Poniższy przykład dodaje jedną właściwość o nazwie CreditCardNumber.

  3. Zastąpi właściwość , BehaviorType aby zwrócić typ niestandardowej klasy poświadczeń klienta utworzonej za pomocą elementu konfiguracji.

  4. Zastąpij metodę CreateBehavior . Metoda jest odpowiedzialna za tworzenie i zwracanie wystąpienia niestandardowej klasy poświadczeń na podstawie ustawień załadowanych z pliku konfiguracji. Wywołaj metodę podstawową ApplyConfiguration(ClientCredentials) z tej metody, aby pobrać ustawienia poświadczeń dostarczonych przez system załadowanych do niestandardowego wystąpienia poświadczeń klienta.

  5. Opcjonalny. Jeśli dodano dodatkowe właściwości w kroku 2, należy zastąpić Properties właściwość w celu zarejestrowania dodatkowych ustawień konfiguracji dla platformy konfiguracji w celu ich rozpoznawania. Połącz właściwości z właściwościami klasy bazowej, aby umożliwić skonfigurowanie ustawień udostępnionych przez system za pomocą tego niestandardowego elementu konfiguracji poświadczeń klienta.

    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
    

Po utworzeniu klasy programu obsługi konfiguracji można ją zintegrować ze strukturą konfiguracji WCF. Umożliwia to użycie niestandardowych poświadczeń klienta w elementach zachowania punktu końcowego klienta, jak pokazano w następnej procedurze.

Aby zarejestrować i użyć niestandardowej procedury obsługi konfiguracji poświadczeń klienta w konfiguracji aplikacji

  1. <extensions> Dodaj element i <behaviorExtensions> element do pliku konfiguracji.

  2. <add> Dodaj element do <behaviorExtensions> elementu i ustaw name atrybut na odpowiednią wartość.

  3. type Ustaw atrybut na w pełni kwalifikowaną nazwę typu. Uwzględnij również nazwę zestawu i inne atrybuty zestawu.

    <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. Po zarejestrowaniu programu obsługi konfiguracji element poświadczeń niestandardowych może być używany w tym samym pliku konfiguracji zamiast elementu dostarczonego <clientCredentials> przez system. Możesz użyć zarówno właściwości dostarczonych przez system, jak i wszelkich nowych właściwości dodanych do implementacji programu obsługi konfiguracji. W poniższym przykładzie ustawiono wartość właściwości niestandardowej przy użyciu atrybutu creditCardNumber .

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

Aby zaimplementować poświadczenia usługi niestandardowej

  1. Zdefiniuj nową klasę pochodzącą z klasy ServiceCredentials.

  2. Opcjonalny. Dodaj nowe właściwości, aby zapewnić interfejsy API dla nowych wartości poświadczeń, które są dodawane. Jeśli nie dodasz nowych wartości poświadczeń, pomiń ten krok. Poniższy przykład dodaje AdditionalCertificate właściwość.

  3. Zastąpij metodę CreateSecurityTokenManager . Ta metoda jest wywoływana automatycznie przez infrastrukturę WCF, gdy używane jest niestandardowe poświadczenie klienta. Metoda jest odpowiedzialna za tworzenie i zwracanie wystąpienia implementacji SecurityTokenManager klasy (opisanej w następnej procedurze).

  4. Opcjonalny. Zastąpij metodę CloneCore . Jest to wymagane tylko w przypadku dodawania nowych właściwości lub pól wewnętrznych do niestandardowej implementacji poświadczeń klienta.

    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
    

Aby zaimplementować niestandardowego menedżera tokenów zabezpieczających usługi

  1. Zdefiniuj nową klasę pochodzącą ServiceCredentialsSecurityTokenManager z klasy .

  2. Opcjonalny. Zastąpi metodę CreateSecurityTokenProvider , jeśli należy utworzyć niestandardową SecurityTokenProvider implementację. Aby uzyskać więcej informacji na temat niestandardowych dostawców tokenów zabezpieczających, zobacz How to: Create a Custom Security Token Provider (Instrukcje: tworzenie niestandardowego dostawcy tokenów zabezpieczających).

  3. Opcjonalny. Zastąpi metodę CreateSecurityTokenAuthenticator , jeśli należy utworzyć niestandardową SecurityTokenAuthenticator implementację. Aby uzyskać więcej informacji na temat niestandardowych wystawców uwierzytelnień tokenów zabezpieczających, zobacz Temat How to: Create a Custom Security Token Authenticator (Instrukcje: tworzenie niestandardowego wystawcy uwierzytelniania tokenu zabezpieczającego).

  4. Opcjonalny. Zastąpi metodę CreateSecurityTokenSerializer(SecurityTokenVersion) , jeśli należy utworzyć niestandardową SecurityTokenSerializer . Aby uzyskać więcej informacji o niestandardowych tokenach zabezpieczających i niestandardowych serializatorach tokenów zabezpieczających, zobacz Instrukcje: tworzenie tokenu niestandardowego.

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

Aby użyć niestandardowych poświadczeń usługi z kodu aplikacji

  1. Utwórz wystąpienie elementu ServiceHost.

  2. Usuń zachowanie poświadczeń usługi dostarczonej przez system z kolekcji Behaviors .

  3. Utwórz nowe wystąpienie klasy poświadczeń usługi niestandardowej i dodaj je do Behaviors kolekcji.

    // 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())
    

Dodaj obsługę konfiguracji, wykonując kroki opisane wcześniej w procedurach "To create a configuration handler for custom client credentials" i "To register and use a custom client credentials configuration handler in the application configuration". Jedyną różnicą jest użycie ServiceCredentialsElement klasy zamiast ClientCredentialsElement klasy jako klasy bazowej dla programu obsługi konfiguracji. Niestandardowy element poświadczeń usługi może być następnie używany wszędzie tam, gdzie jest używany element dostarczany <serviceCredentials> przez system.

Zobacz też