Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Ukázka DurableIssuedTokenProvider ukazuje, jak implementovat vlastního zprostředkovatele tokenu vystaveného klientem.
Diskuse
Zprostředkovatel tokenu ve Windows Communication Foundation (WCF) slouží k poskytování přihlašovacích údajů infrastruktuře zabezpečení. Zprostředkovatel tokenu obecně zkoumá cíl a vydává příslušné přihlašovací údaje, aby infrastruktura zabezpečení zprávu zabezpečila. WCF dodává se zprostředkovatelem tokenu CardSpace. Vlastní zprostředkovatelé tokenů jsou užitečné v následujících případech:
Pokud máte úložiště přihlašovacích údajů, se kterým nemůže integrovaný zprostředkovatel tokenů pracovat.
Pokud chcete poskytnout vlastní mechanismus pro transformaci přihlašovacích údajů od okamžiku, kdy uživatel zadá podrobnosti, až do chvíle, kdy klient WCF tyto údaje použije.
Pokud vytváříte vlastní token.
Tato ukázka ukazuje, jak vytvořit vlastního zprostředkovatele tokenů, který ukládá tokeny do mezipaměti vydané službou tokenů zabezpečení (STS).
Abychom to shrnuli, tento příklad demonstruje následující:
Jak lze klienta nakonfigurovat s vlastním poskytovatelem tokenů.
Způsob uložení vydaných tokenů do mezipaměti a poskytnutí klientovi WCF.
Způsob ověření serveru klientem pomocí certifikátu X.509 serveru.
Tato ukázka se skládá z programu klientské konzoly (Client.exe), programu konzoly služby tokenu zabezpečení (Securitytokenservice.exe) a programu konzoly služby (Service.exe). Služba implementuje kontrakt, který definuje komunikační vzor žádosti a odpovědi. Kontrakt je definován ICalculator rozhraním, které zveřejňuje matematické operace (sčítání, odčítání, násobení a dělení). Klient získá token zabezpečení ze služby tokenů zabezpečení (STS) a provede synchronní požadavky na službu pro danou matematickou operaci a služba odpoví výsledkem. Aktivita klienta je viditelná v okně konzoly.
Poznámka:
Postup nastavení a pokyny k sestavení pro tuto ukázku najdete na konci tohoto tématu.
Tato ukázka zveřejňuje kontrakt ICalculator pomocí <wsHttpBinding>. Konfigurace této vazby na klientovi se zobrazí v následujícím kódu.
<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 elementu security ve wsFederationHttpBinding hodnota mode určuje, který režim zabezpečení by měl být použit. V této ukázce se používá zabezpečení zpráv, což je důvod, proč message je prvek wsFederationHttpBinding zadaný uvnitř security prvku wsFederationHttpBinding. Prvek issuerwsFederationHttpBinding uvnitř message prvku wsFederationHttpBinding určuje adresu a vazbu pro službu tokenů zabezpečení, která vydává token zabezpečení klientovi, aby se klient mohl ověřit ve službě Kalkulačka.
Konfigurace této vazby ve službě je zobrazena v následujícím kódu.
<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 elementu security ve wsFederationHttpBinding hodnota mode určuje, který režim zabezpečení by měl být použit. V této ukázce se používá zabezpečení zpráv, což je důvod, proč message je prvek wsFederationHttpBinding zadaný uvnitř security prvku wsFederationHttpBinding. Prvek issuerMetadatawsFederationHttpBinding uvnitř message elementu wsFederationHttpBinding určuje adresu a identitu koncového bodu, který lze použít k načtení metadat pro službu tokenů zabezpečení.
Chování služby se zobrazí v následujícím kódu.
<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 uvnitř elementu serviceCredentials umožňuje službě určit omezení tokenů, které umožňuje klientům prezentovat během ověřování. Tato konfigurace určuje, že služba přijímá tokeny podepsané certifikátem, jehož název subjektu je CN=STS.
Služba tokenů zabezpečení zveřejňuje jeden koncový bod pomocí standardu wsHttpBinding. Služba tokenů zabezpečení reaguje na žádost klientů o tokeny a za předpokladu, že se klient ověřuje pomocí účtu Systému Windows, vydá token, který obsahuje uživatelské jméno klienta jako deklaraci identity v vydaném tokenu. V rámci vytváření tokenu služba tokenů zabezpečení podepíše token pomocí privátního klíče přidruženého k certifikátu CN=STS. Kromě toho vytvoří symetrický klíč a zašifruje ho pomocí veřejného klíče přidruženého k certifikátu CN=localhost. Při vrácení tokenu klientovi vrátí služba tokenů zabezpečení také symetrický klíč. Klient zobrazí vystavený token službě Calculator a prokáže, že zná symetrický klíč podepsáním zprávy s tímto klíčem.
Vlastní přihlašovací údaje klienta a zprostředkovatel tokenů
Následující kroky ukazují, jak vytvořit vlastního zprostředkovatele tokenů, který ukládá do mezipaměti vydané tokeny a integrovat ho se službou WCF: zabezpečení.
Vývoj vlastního zprostředkovatele tokenů
Napište vlastního zprostředkovatele tokenu.
Ukázka implementuje vlastního zprostředkovatele tokenu, který vrací token zabezpečení načtený z mezipaměti.
Pro provedení tohoto úkolu odvodí vlastní zprostředkovatel tokenů třídu SecurityTokenProvider a přepíše metodu GetTokenCore. Tato metoda se pokusí získat token z mezipaměti, nebo pokud token nelze najít v mezipaměti, načte token od základního zprostředkovatele a pak tento token uloží do mezipaměti. V obou případech metoda vrátí
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; }Napište vlastní správce tokenů zabezpečení.
Tento prvek SecurityTokenManager se používá k vytvoření SecurityTokenProvider pro konkrétní SecurityTokenRequirement, který je jí předán metodou
CreateSecurityTokenProvider. Správce tokenů zabezpečení se také používá k vytváření ověřovacích a serializátorů tokenů, ale ty nejsou součástí této ukázky. V této ukázce vlastní správce tokenů zabezpečení dědí z ClientCredentialsSecurityTokenManager třídy a přepíše metoduCreateSecurityTokenProvidertak, aby vrátila zprostředkovatele vlastního tokenu, když předané požadavky na token značí, že se požaduje vystavený 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); } } }Napište vlastní přihlašovací údaje klienta.
Třída přihlašovacích údajů klienta slouží k reprezentaci přihlašovacích údajů nakonfigurovaných pro proxy klienta a vytvoří správce tokenů zabezpečení, který slouží k získání ověřovacích mechanismů tokenů, zprostředkovatelů tokenů a serializátorů tokenů.
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()); } }Implementujte mezipaměť tokenů. Ukázková implementace používá abstraktní základní třídu, prostřednictvím které uživatelé dané mezipaměti tokenů interagují s mezipamětí.
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 používal vlastní přihlašovací údaje klienta, ukázka odstraní výchozí třídu přihlašovacích údajů klienta a dodává novou třídu přihlašovacích údajů klienta.
clientFactory.Endpoint.Behaviors.Remove<ClientCredentials>(); DurableIssuedTokenClientCredentials durableCreds = new DurableIssuedTokenClientCredentials(); durableCreds.IssuedTokenCache = cache; durableCreds.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.PeerOrChainTrust; clientFactory.Endpoint.Behaviors.Add(durableCreds);
Spuštění ukázkového programu
Ukázku spustíte podle následujících pokynů. Při spuštění ukázky se požadavek na token zabezpečení zobrazí v okně konzoly služby tokenů zabezpečení. Požadavky na operace a odpovědi se zobrazí v oknech konzoly klienta a služeb. Stisknutím klávesy ENTER v libovolném okně konzoly aplikaci vypnete.
Dávkový soubor Setup.cmd
Dávkový soubor Setup.cmd, který je součástí této ukázky, umožňuje nakonfigurovat službu tokenů serveru a zabezpečení s příslušnými certifikáty pro spuštění aplikace v místním prostředí. Dávkový soubor vytvoří dva certifikáty v úložišti certifikátů CurrentUser/TrustedPeople. První certifikát má název subjektu CN=STS a používá ho služba tokenů zabezpečení k podepsání tokenů zabezpečení, které vydává klientovi. Druhý certifikát má jméno subjektu CN=localhost a používá ho služba tokenů zabezpečení k šifrování tajného kódu, aby ho služba mohla dešifrovat.
Jak nastavit, sestavit a spustit ukázku
Spuštěním souboru Setup.cmd vytvořte požadované certifikáty.
Pro sestavení řešení postupujte podle pokynů v Sestavení ukázek Windows Communication Foundation. Ujistěte se, že jsou všechny projekty v řešení vytvořené (Shared, RSTRSTR, Service, SecurityTokenService a Client).
Ujistěte se, že Service.exe i SecurityTokenService.exe běží s oprávněními správce.
Spusťte Client.exe.
Úklid po vzorku
Po dokončení spuštění ukázky spusťte Cleanup.cmd ve složce s ukázkami.