Zprostředkovatel trvalých vydaných tokenů

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ů

  1. 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;
    }
    
  2. 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 metodu CreateSecurityTokenProvider tak, 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);
        }
      }
    }
    
  3. 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());
      }
    }
    
  4. 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

  1. Spuštěním souboru Setup.cmd vytvořte požadované certifikáty.

  2. 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).

  3. Ujistěte se, že Service.exe i SecurityTokenService.exe běží s oprávněními správce.

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