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ą:
Instrukcje: tworzenie niestandardowego dostawcy tokenów zabezpieczeń
Instrukcje: tworzenie niestandardowego wystawcy uwierzytelniania tokenu zabezpieczeń
Instrukcje: tworzenie tokenu niestandardowego.
Procedury
Aby zaimplementować niestandardowe poświadczenia klienta
Zdefiniuj nową klasę pochodzącą ClientCredentials z klasy .
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ść.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 .
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
Zdefiniuj nową klasę pochodzącą z klasy ClientCredentialsSecurityTokenManager.
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).
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).
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
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ć.
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 .
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
Zdefiniuj nową klasę pochodzącą z klasy ClientCredentialsElement.
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
.Zastąpi właściwość , BehaviorType aby zwrócić typ niestandardowej klasy poświadczeń klienta utworzonej za pomocą elementu konfiguracji.
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.
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
<extensions>
Dodaj element i<behaviorExtensions>
element do pliku konfiguracji.<add>
Dodaj element do<behaviorExtensions>
elementu i ustawname
atrybut na odpowiednią wartość.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>
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 atrybutucreditCardNumber
.<behaviors> <endpointBehaviors> <behavior name="myClientCredentialsBehavior"> <myClientCredentials creditCardNumber="123-123-123"/> </behavior> </endpointBehaviors> </behaviors>
Aby zaimplementować poświadczenia usługi niestandardowej
Zdefiniuj nową klasę pochodzącą z klasy ServiceCredentials.
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ść.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).
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
Zdefiniuj nową klasę pochodzącą ServiceCredentialsSecurityTokenManager z klasy .
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).
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).
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
Utwórz wystąpienie elementu ServiceHost.
Usuń zachowanie poświadczeń usługi dostarczonej przez system z kolekcji Behaviors .
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ż
- ClientCredentials
- ServiceCredentials
- SecurityCredentialsManager
- SecurityTokenManager
- ClientCredentialsElement
- ServiceCredentialsElement
- Instrukcje: tworzenie niestandardowego dostawcy tokenów zabezpieczeń
- Instrukcje: tworzenie niestandardowego wystawcy uwierzytelniania tokenu zabezpieczeń
- Instrukcje: tworzenie tokenu niestandardowego