Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Przykład DurableIssuedTokenProvider pokazuje, jak zaimplementować niestandardowego dostawcę tokenu wystawionego przez klienta.
Dyskusja
Dostawca tokenów w programie Windows Communication Foundation (WCF) służy do dostarczania poświadczeń do infrastruktury zabezpieczeń. Dostawca tokenu ogólnie sprawdza cel i wystawia odpowiednie poświadczenia, aby infrastruktura zabezpieczeń mogła zabezpieczyć komunikat. Program WCF jest dostarczany z dostawcą tokenów CardSpace. Niestandardowi dostawcy tokenów są przydatni w następujących przypadkach:
W przypadku posiadania magazynu poświadczeń, z którym wbudowany dostawca tokenów nie może współpracować.
Jeśli chcesz dostarczyć własny mechanizm do przekształcania poświadczeń, od momentu, gdy użytkownik poda szczegóły, do chwili, gdy klient WCF użyje tych poświadczeń.
Jeśli tworzysz token niestandardowy.
W tym przykładzie pokazano, jak utworzyć niestandardowego dostawcę tokenów, który buforuje tokeny wystawione przez usługę tokenu zabezpieczającego (STS).
Podsumowując, w tym przykładzie przedstawiono następujące kwestie:
Jak można skonfigurować klienta za pomocą niestandardowego dostawcy tokenów.
Jak wystawione tokeny można buforować i dostarczać do klienta programu WCF.
Sposób uwierzytelniania serwera przez klienta przy użyciu certyfikatu X.509 serwera.
Ten przykład składa się z programu konsoli klienta (Client.exe), programu konsoli usługi tokenów bezpieczeństwa (Securitytokenservice.exe) i programu konsoli usług (Service.exe). Usługa implementuje kontrakt, który definiuje wzorzec komunikacji typu żądanie-odpowiedź. Kontrakt jest definiowany przez ICalculator
interfejs, który uwidacznia operacje matematyczne (dodawanie, odejmowanie, mnożenie i dzielenie). Klient pobiera token zabezpieczający z usługi tokenu zabezpieczającego (STS) i wykonuje synchroniczne żądania do usługi dla danej operacji matematycznej, a usługa odpowiada z wynikiem. Działanie klienta jest widoczne w oknie konsoli.
Uwaga / Notatka
Procedura konfiguracji i instrukcje kompilacji dla tego przykładu znajdują się na końcu tego tematu.
Ten przykład uwidacznia kontrakt ICalculator przy użyciu elementu< wsHttpBinding>. Konfiguracja tego powiązania na kliencie jest wyświetlana w poniższym kodzie.
<bindings>
<wsFederationHttpBinding>
<binding name="ServiceFed">
<security mode="Message">
<message issuedKeyType="SymmetricKey"
issuedTokenType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1">
<issuer address="http://localhost:8000/sts/windows"
binding="wsHttpBinding" />
</message>
</security>
</binding>
</wsFederationHttpBinding>
</bindings>
Na elemencie security
w wsFederationHttpBinding
wartość mode
określa, który tryb zabezpieczeń powinien być używany. W tym przykładzie używane są zabezpieczenia komunikatów, dlatego element message
elementu wsFederationHttpBinding
jest określony wewnątrz elementu security
w elemencie wsFederationHttpBinding
. Element issuer
wsFederationHttpBinding
wewnątrz elementu message
elementu wsFederationHttpBinding
określa adres i powiązanie dla Usługi Tokenu Zabezpieczającego, która wystawia token zabezpieczający klientowi, aby klient mógł uwierzytelnić się w usłudze Kalkulator.
Konfiguracja tego powiązania w usłudze jest wyświetlana w poniższym kodzie.
<bindings>
<wsFederationHttpBinding>
<binding name="ServiceFed">
<security mode="Message">
<message issuedKeyType="SymmetricKey"
issuedTokenType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1">
<issuerMetadata address="http://localhost:8000/sts/mex">
<identity>
<certificateReference storeLocation="CurrentUser"
storeName="TrustedPeople"
x509FindType="FindBySubjectDistinguishedName"
findValue="CN=STS" />
</identity>
</issuerMetadata>
</message>
</security>
</binding>
</wsFederationHttpBinding>
</bindings>
Na elemencie security
w wsFederationHttpBinding
wartość mode
określa, który tryb zabezpieczeń powinien być używany. W tym przykładzie używane są zabezpieczenia komunikatów, dlatego element message
elementu wsFederationHttpBinding
jest określony wewnątrz elementu security
w elemencie wsFederationHttpBinding
. Element issuerMetadata
wsFederationHttpBinding
wewnątrz elementu message
wsFederationHttpBinding
określa adres i tożsamość punktu końcowego, który może służyć do pobierania metadanych dla usługi zabezpieczania tokenów.
Zachowanie usługi jest wyświetlane w poniższym kodzie.
<behavior name="ServiceBehavior">
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceMetadata httpGetEnabled="true" />
<serviceCredentials>
<issuedTokenAuthentication>
<knownCertificates>
<add storeLocation="LocalMachine"
storeName="TrustedPeople"
x509FindType="FindBySubjectDistinguishedName"
findValue="CN=STS" />
</knownCertificates>
</issuedTokenAuthentication>
<serviceCertificate storeLocation="LocalMachine"
storeName="My"
x509FindType="FindBySubjectDistinguishedName"
findValue="CN=localhost" />
</serviceCredentials>
</behavior>
Element issuedTokenAuthentication
wewnątrz serviceCredentials
elementu umożliwia usłudze określanie ograniczeń dotyczących tokenów, które umożliwiają klientom prezentowanie podczas uwierzytelniania. Ta konfiguracja określa, że tokeny podpisane przez certyfikat, którego nazwa podmiotu jest CN=STS są akceptowane przez usługę.
Usługa tokenu zabezpieczającego uwidacznia pojedynczy punkt końcowy przy użyciu standardowego rozwiązania wsHttpBinding. Usługa tokenu zabezpieczającego odpowiada na żądanie od klientów dla tokenów i pod warunkiem, że klient uwierzytelnia się przy użyciu konta systemu Windows, wystawia token zawierający nazwę użytkownika klienta jako oświadczenie w wystawionym tokenie. W ramach tworzenia tokenu usługa tokenu zabezpieczającego podpisuje token przy użyciu klucza prywatnego skojarzonego z certyfikatem CN=STS. Ponadto tworzy klucz symetryczny i szyfruje go przy użyciu klucza publicznego skojarzonego z certyfikatem CN=localhost. W przypadku zwracania tokenu do klienta usługa tokenu zabezpieczającego zwraca również klucz symetryczny. Klient przedstawia wystawiony token do usługi Kalkulator i potwierdza, że zna klucz symetryczny, podpisując komunikat za pomocą tego klucza.
Niestandardowe poświadczenia klienta i dostawca tokenów
W poniższych krokach pokazano, jak utworzyć niestandardowego dostawcę tokenów, który buforuje wystawione tokeny i integruje go z usługą WCF: zabezpieczenia.
Aby opracować niestandardowego dostawcę tokenów
Napisz dostawcę niestandardowych tokenów.
Przykład implementuje niestandardowego dostawcę tokenów, który zwraca token zabezpieczający pobrany z pamięci podręcznej.
Aby wykonać to zadanie, niestandardowy dostawca tokenu uzyskuje klasę SecurityTokenProvider i zastępuje metodę GetTokenCore . Ta metoda próbuje uzyskać token z pamięci podręcznej lub jeśli nie można odnaleźć tokenu w pamięci podręcznej, pobiera token od dostawcy bazowego, a następnie buforuje ten token. W obu przypadkach metoda zwraca
SecurityToken
.protected override SecurityToken GetTokenCore(TimeSpan timeout) { GenericXmlSecurityToken token; if (!this.cache.TryGetToken(target, issuer, out token)) { token = (GenericXmlSecurityToken) this.innerTokenProvider.GetToken(timeout); this.cache.AddToken(token, target, issuer); } return token; }
Napisz niestandardowego menedżera tokenów zabezpieczających.
Element SecurityTokenManager służy do tworzenia SecurityTokenProvider dla określonego SecurityTokenRequirement, który jest przekazywany do niego w metodzie
CreateSecurityTokenProvider
. Menedżer tokenów zabezpieczających służy również do tworzenia wystawców uwierzytelnień tokenów i serializatorów tokenów, ale nie są one objęte tym przykładem. W tym przykładzie niestandardowy menedżer tokenów zabezpieczających dziedziczy z klasy ClientCredentialsSecurityTokenManager i zastępuje metodęCreateSecurityTokenProvider
, żeby zwrócić niestandardowego dostawcę tokenu, gdy przekazane wymagania wskazują, że zażądano ten token.class DurableIssuedTokenClientCredentialsTokenManager : ClientCredentialsSecurityTokenManager { IssuedTokenCache cache; public DurableIssuedTokenClientCredentialsTokenManager ( DurableIssuedTokenClientCredentials creds ): base(creds) { this.cache = creds.IssuedTokenCache; } public override SecurityTokenProvider CreateSecurityTokenProvider ( SecurityTokenRequirement tokenRequirement ) { if (IsIssuedSecurityTokenRequirement(tokenRequirement)) { return new DurableIssuedSecurityTokenProvider ((IssuedSecurityTokenProvider)base.CreateSecurityTokenProvider( tokenRequirement), this.cache); } else { return base.CreateSecurityTokenProvider(tokenRequirement); } } }
Napisz niestandardowe poświadczenie klienta.
Klasa poświadczeń klienta służy do reprezentowania poświadczeń skonfigurowanych dla serwera proxy klienta i tworzy menedżera tokenów zabezpieczających używany do uzyskiwania wystawców uwierzytelnień tokenów, dostawców tokenów i serializatorów tokenów.
public class DurableIssuedTokenClientCredentials : ClientCredentials { IssuedTokenCache cache; public DurableIssuedTokenClientCredentials() : base() { } DurableIssuedTokenClientCredentials ( DurableIssuedTokenClientCredentials other) : base(other) { this.cache = other.cache; } public IssuedTokenCache IssuedTokenCache { get { return this.cache; } set { this.cache = value; } } protected override ClientCredentials CloneCore() { return new DurableIssuedTokenClientCredentials(this); } public override SecurityTokenManager CreateSecurityTokenManager() { return new DurableIssuedTokenClientCredentialsTokenManager ((DurableIssuedTokenClientCredentials)this.Clone()); } }
Zaimplementuj bufor tokenu. Przykładowa implementacja używa abstrakcyjnej klasy bazowej, która umożliwia konsumentom interakcję z daną pamięcią podręczną tokenu.
public abstract class IssuedTokenCache { public abstract void AddToken ( GenericXmlSecurityToken token, EndpointAddress target, EndpointAddress issuer); public abstract bool TryGetToken(EndpointAddress target, EndpointAddress issuer, out GenericXmlSecurityToken cachedToken); } // Configure the client to use the custom client credential.
Aby klient używał niestandardowych poświadczeń klienta, przykład usuwa domyślną klasę poświadczeń klienta i dostarcza nową klasę poświadczeń klienta.
clientFactory.Endpoint.Behaviors.Remove<ClientCredentials>(); DurableIssuedTokenClientCredentials durableCreds = new DurableIssuedTokenClientCredentials(); durableCreds.IssuedTokenCache = cache; durableCreds.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.PeerOrChainTrust; clientFactory.Endpoint.Behaviors.Add(durableCreds);
Uruchamianie przykładu
Zapoznaj się z poniższymi instrukcjami, aby uruchomić przykład. Po uruchomieniu przykładu żądanie tokenu zabezpieczającego jest wyświetlane w oknie konsoli usługi tokenu zabezpieczającego. Żądania operacji i odpowiedzi są wyświetlane w oknach konsoli klienta i usługi. Naciśnij ENTER w dowolnym z okien konsoli, aby zamknąć aplikację.
Plik wsadowy Setup.cmd
Plik wsadowy Setup.cmd dołączony do tego przykładu umożliwia skonfigurowanie serwera i usługi tokenu zabezpieczającego przy użyciu odpowiednich certyfikatów w celu uruchomienia aplikacji hostowanej samodzielnie. Plik wsadowy tworzy dwa certyfikaty, oba w magazynie certyfikatów CurrentUser/TrustedPeople. Pierwszy certyfikat ma nazwę podmiotu CN=STS i jest używany przez usługę tokenu zabezpieczającego do podpisywania tokenów zabezpieczających, które wystawia klientowi. Drugi certyfikat ma nazwę podmiotu CN=localhost i jest używany przez Usługę Tokenu Bezpieczeństwa do szyfrowania tajnej informacji, aby usługa mogła ją odszyfrować.
Aby skonfigurować, skompilować i uruchomić przykładowy program
Uruchom plik Setup.cmd, aby utworzyć wymagane certyfikaty.
Aby skompilować rozwiązanie, postępuj zgodnie z instrukcjami w temacie Building the Windows Communication Foundation Samples (Tworzenie przykładów programu Windows Communication Foundation). Upewnij się, że wszystkie projekty w rozwiązaniu zostały skompilowane (Shared, RSTRSTR, Service, SecurityTokenService i Client).
Upewnij się, że Service.exe i SecurityTokenService.exe są uruchomione z uprawnieniami administratora.
Uruchom Client.exe.
Aby posprzątać po próbie
Uruchom Cleanup.cmd w folderze próbki po zakończeniu uruchamiania przykładu.