Sdílet prostřednictvím


Postupy: Vytvoření federovaného klienta

Ve Windows Communication Foundation (WCF) se vytvoření klienta pro federovanou službu skládá ze tří hlavních kroků:

  1. <Nakonfigurujte wsFederationHttpBinding> nebo podobnou vlastní vazbu. Další informace o vytvoření vhodné vazby naleznete v tématu Postupy: Vytvoření WSFederationHttpBinding. Případně spusťte nástroj ServiceModel Metadata Utility (Svcutil.exe) na koncovém bodu metadat federované služby a vygenerujte konfigurační soubor pro komunikaci s federovanou službou a jednou nebo více službami tokenů zabezpečení.

  2. Nastavte vlastnosti IssuedTokenClientCredential , které řídí různé aspekty interakce klienta se službou tokenů zabezpečení.

  3. Nastavte vlastnosti objektu X509CertificateRecipientClientCredential, který umožňuje bezpečné komunikaci certifikátů s danými koncovými body, jako jsou služby tokenů zabezpečení.

Poznámka:

Může CryptographicException se vyvolat, když klient používá zosobněné přihlašovací údaje, WSFederationHttpBinding vazbu nebo vlastní token a asymetrické klíče. Asymetrické klíče se používají s vazbami WSFederationHttpBinding a vlastními tokeny, pokud IssuedKeyType KeyType jsou vlastnosti nastaveny na AsymmetricKey. Vyvolá se CryptographicException , když se klient pokusí odeslat zprávu a profil uživatele neexistuje pro identitu, kterou klient zosobní. Pokud chcete tento problém zmírnit, přihlaste se k klientskému počítači nebo před odesláním zprávy zavolat LoadUserProfile .

Toto téma obsahuje podrobné informace o těchto postupech. Další informace o vytvoření vhodné vazby naleznete v tématu Postupy: Vytvoření WSFederationHttpBinding. Další informace o tom, jak federovaná služba funguje, najdete v tématu Federace.

Generování a prozkoumání konfigurace federované služby

  1. Spusťte nástroj ServiceModel Metadata Utility (Svcutil.exe) s adresou URL metadat služby jako parametr příkazového řádku.

  2. Otevřete vygenerovaný konfigurační soubor v příslušném editoru.

  3. Prozkoumejte atributy a obsah všech vygenerovaných <prvků vystavitele> a< issuerMetadata>. Nacházejí se v elementech <zabezpečení> pro <wsFederationHttpBinding> nebo vlastní vazby elementy. Zajistěte, aby adresy obsahovaly očekávané názvy domén nebo jiné informace o adrese. Tyto informace je důležité zkontrolovat, protože se klient ověřuje na těchto adresách a může zveřejnit informace, jako jsou páry uživatelských jmen a hesel. Pokud adresa není očekávanou adresou, může to vést k zpřístupnění informací nechtěným příjemcům.

  4. Prozkoumejte všechny další vystavené elementyTokenParameters> uvnitř zakomentovaného elementu<alternativeIssuedTokenParameters>.< Při použití nástroje Svcutil.exe ke generování konfigurace pro federovanou službu platí, že pokud federovaná služba nebo jakákoli zprostředkující služba tokenu zabezpečení nezadávají adresu vystavitele, ale místo toho zadejte adresu metadat pro službu tokenů zabezpečení, která zveřejňuje více koncových bodů, výsledný konfigurační soubor odkazuje na první koncový bod. Další koncové body jsou v konfiguračním souboru jako komentované <alternativeIssuedTokenParameters> prvky.

    Určete, zda je jedna z těchto možností <issuedTokenParameters> vhodnější než ta, která již existuje v konfiguraci. Klient například může preferovat ověření ve službě tokenů zabezpečení pomocí tokenu Windows CardSpace místo páru uživatelských jmen a hesel.

    Poznámka:

    Pokud se před komunikací se službou musí projít více služeb tokenů zabezpečení, je možné, aby služba zprostředkujícího tokenu zabezpečení nasměrovala klienta na nesprávnou službu tokenů zabezpečení. Proto se ujistěte, že koncový bod pro službu tokenů zabezpečení ve <vydanémTokenParameters je očekávaná služba tokenů> zabezpečení, a ne neznámá služba tokenů zabezpečení.

Konfigurace IssuedTokenClientCredential v kódu

  1. Získejte přístup prostřednictvím IssuedTokenClientCredential IssuedToken vlastnosti ClientCredentials třídy (vrácenou ClientCredentials vlastností ClientBase<TChannel> třídy nebo prostřednictvím ChannelFactory třídy), jak je znázorněno v následujícím příkladu kódu.

    IssuedTokenClientCredential itcc = client.ClientCredentials.IssuedToken;
    
    Dim itcc As IssuedTokenClientCredential = client.ClientCredentials.IssuedToken
    
  2. Pokud není vyžadováno ukládání tokenů do mezipaměti, nastavte CacheIssuedTokens vlastnost na falsehodnotu . Vlastnost CacheIssuedTokens řídí, zda jsou tyto tokeny ze služby tokenů zabezpečení uloženy do mezipaměti. Pokud je tato vlastnost nastavená na false, klient požádá o nový token ze služby tokenů zabezpečení, kdykoli se musí znovu ověřit ve federované službě bez ohledu na to, jestli je předchozí token stále platný. Pokud je tato vlastnost nastavená na true, klient znovu použije existující token pokaždé, když se musí znovu ověřit ve federované službě (pokud platnost tokenu nevypršela). Výchozí hodnota je true.

  3. Pokud je u tokenů uložených v mezipaměti vyžadován časový limit, nastavte MaxIssuedTokenCachingTime vlastnost na TimeSpan hodnotu. Vlastnost určuje, jak dlouho může být token uložen v mezipaměti. Po uplynutí zadaného časového rozsahu se token odebere z mezipaměti klienta. Ve výchozím nastavení se tokeny ukládají do mezipaměti po neomezenou dobu. Následující příklad nastaví časový rozsah na 10 minut.

    itcc.MaxIssuedTokenCachingTime = new TimeSpan(0, 10, 0);
    
    itcc.MaxIssuedTokenCachingTime = New TimeSpan(0, 10, 0)
    
  4. Nepovinné. IssuedTokenRenewalThresholdPercentage Nastavte na procento. Výchozí hodnota je 60 (procento). Vlastnost určuje procento doby platnosti tokenu. Pokud je například vystavený token platný po dobu 10 hodin a IssuedTokenRenewalThresholdPercentage nastaví se na 80, token se obnoví po osmi hodinách. Následující příklad nastaví hodnotu na 80 procent.

    itcc.IssuedTokenRenewalThresholdPercentage = 80;
    
    itcc.IssuedTokenRenewalThresholdPercentage = 80
    

    Interval obnovení určený obdobím platnosti tokenu a IssuedTokenRenewalThresholdPercentage hodnota se přepíše MaxIssuedTokenCachingTime hodnotou v případech, kdy je doba ukládání do mezipaměti kratší než prahová doba obnovení. Pokud je například součin IssuedTokenRenewalThresholdPercentage doby trvání tokenu a doba trvání tokenu osm hodin a MaxIssuedTokenCachingTime hodnota je 10 minut, klient kontaktuje službu tokenu zabezpečení pro aktualizovaný token každých 10 minut.

  5. Pokud je pro vazbu potřeba jiný CombinedEntropy režim entropie klíče, který nepoužívá zabezpečení zpráv nebo zabezpečení přenosu s přihlašovacími údaji zprávy (například vazba nemá SecurityBindingElement), nastavte DefaultKeyEntropyMode vlastnost na odpovídající hodnotu. Režim entropie určuje, zda lze symetrické klíče ovládat pomocí DefaultKeyEntropyMode vlastnosti. Toto výchozí nastavení je CombinedEntropy, kde klient i vystavitel tokenu poskytují data, která jsou kombinována k vytvoření skutečného klíče. Jiné hodnoty jsou ClientEntropy a ServerEntropy, což znamená, že celý klíč je určen klientem nebo serverem, v uvedeném pořadí. Následující příklad nastaví vlastnost tak, aby používala pouze data serveru pro klíč.

    itcc.DefaultKeyEntropyMode = SecurityKeyEntropyMode.ServerEntropy;
    
    itcc.DefaultKeyEntropyMode = SecurityKeyEntropyMode.ServerEntropy
    

    Poznámka:

    SecurityBindingElement Pokud se nachází ve službě tokenu zabezpečení nebo vazbě služby, je nastavena KeyEntropyMode DefaultKeyEntropyMode IssuedTokenClientCredential SecurityBindingElementvlastnost .

  6. Nakonfigurujte chování koncového bodu specifického pro vystavitele tak, že je přidáte do kolekce vrácené IssuerChannelBehaviors vlastností.

    itcc.LocalIssuerChannelBehaviors.Add(myEndpointBehavior);
    
    itcc.LocalIssuerChannelBehaviors.Add(myEndpointBehavior)
    

Konfigurace IssuedTokenClientCredential v konfiguraci

  1. Vytvořte vystavený elementToken <> jako podřízený prvek< vystavenéhoToken> v chování koncového bodu.

  2. Pokud není vyžadováno ukládání tokenů do mezipaměti, nastavte cacheIssuedTokens atribut ( <issuedToken> elementu) na false.

  3. Pokud je u tokenů uložených v mezipaměti vyžadován časový limit, nastavte maxIssuedTokenCachingTime atribut prvku <issuedToken> na odpovídající hodnotu. Příklad: <issuedToken maxIssuedTokenCachingTime='00:10:00' />

  4. Pokud je upřednostňovaná hodnota jiná než výchozí, nastavte issuedTokenRenewalThresholdPercentage atribut prvku <issuedToken> na odpovídající hodnotu, například:

    <issuedToken issuedTokenRenewalThresholdPercentage = "80" />
    
  5. Pokud je jiný režim entropie klíče, než CombinedEntropy je na vazbě, která nepoužívá zabezpečení zpráv nebo zabezpečení přenosu s přihlašovacími údaji zprávy (například vazba nemá ), SecurityBindingElementnastavte defaultKeyEntropyMode atribut prvku <issuedToken> na buď ServerEntropy nebo ClientEntropy podle potřeby.

    <issuedToken defaultKeyEntropyMode = "ServerEntropy" />
    
  6. Nepovinné. Nakonfigurujte chování vlastního koncového bodu specifického pro vystavitele vytvořením <issuerChannelBehaviors> elementu jako podřízeného <issuedToken> prvku. Pro každé chování vytvořte <add> prvek jako podřízený <issuerChannelBehaviors> prvek prvku. Zadejte adresu vystavitele chování nastavením issuerAddress atributu prvku <add> . Určete chování samotné nastavením behaviorConfiguration atributu prvku <add> .

    <issuerChannelBehaviors>
    <add issuerAddress="http://fabrikam.org/sts" behaviorConfiguration="FabrikamSTS" />
    </issuerChannelBehaviors>
    

Konfigurace X509CertificateRecipientClientCredential v kódu

  1. Přístup prostřednictvím X509CertificateRecipientClientCredential ServiceCertificate vlastnosti vlastnosti ClientCredentials ClientBase<TChannel> třídy nebo ChannelFactory vlastnosti.

    X509CertificateRecipientClientCredential rcc =
        client.ClientCredentials.ServiceCertificate;
    
    Dim rcc As X509CertificateRecipientClientCredential = _
    client.ClientCredentials.ServiceCertificate
    
  2. X509Certificate2 Pokud je instance k dispozici pro certifikát pro daný koncový bod, použijte Add metodu kolekce vrácenou ScopedCertificates vlastností.

    rcc.ScopedCertificates.Add(new Uri("http://fabrikam.com/sts"), cert);
    
    rcc.ScopedCertificates.Add(New Uri("http://fabrikam.com/sts"), cert)
    
  3. X509Certificate2 Pokud instance není k dispozici, použijte SetScopedCertificate metodu X509CertificateRecipientClientCredential třídy, jak je znázorněno v následujícím příkladu.

    public void snippet20(CalculatorClient client)
    {
        X509CertificateRecipientClientCredential rcc = client.ClientCredentials.ServiceCertificate;
        rcc.SetScopedCertificate(StoreLocation.CurrentUser,
                                 StoreName.TrustedPeople,
                                 X509FindType.FindBySubjectName,
                                 "FabrikamSTS",
                                 new Uri("http://fabrikam.com/sts"));
    }
    
    rcc.SetScopedCertificate(StoreLocation.CurrentUser, _
                StoreName.TrustedPeople, _
                X509FindType.FindBySubjectName, _
                "FabrikamSTS", _
                New Uri("http://fabrikam.com/sts"))
    

Konfigurace X509CertificateRecipientClientCredential v konfiguraci

  1. Vytvořte element scopedCertificates> jako podřízený< prvek serviceCertificate>, který je sám podřízeným< prvkem clientCredentials> v chování koncového bodu.<

  2. Vytvoření elementu <add> jako podřízeného <scopedCertificates> prvku Zadejte hodnoty pro storeLocation, storeName, x509FindTypea findValue atributy odkazující na příslušný certifikát. targetUri Nastavte atribut na hodnotu, která poskytuje adresu koncového bodu, pro který se má certifikát použít, jak je znázorněno v následujícím příkladu.

    <scopedCertificates>
     <add targetUri="http://fabrikam.com/sts"
          storeLocation="CurrentUser"
          storeName="TrustedPeople"
          x509FindType="FindBySubjectName"
          findValue="FabrikamSTS" />
    </scopedCertificates>
    

Příklad

Následující ukázka kódu konfiguruje instanci IssuedTokenClientCredential třídy v kódu.

// This method configures the IssuedToken property of the Credentials property of a proxy/channel factory
public static void ConfigureIssuedTokenClientCredentials(ChannelFactory cf, bool cacheTokens,
                                                          TimeSpan tokenCacheTime, int renewalPercentage,
                                                          SecurityKeyEntropyMode entropyMode
                                                          )
{
    if (cf == null)
    {
        throw new ArgumentNullException("cf");
    }
    // Set the CacheIssuedTokens property
    cf.Credentials.IssuedToken.CacheIssuedTokens = cacheTokens;

    // Set the MaxIssuedTokenCachingTime property
    cf.Credentials.IssuedToken.MaxIssuedTokenCachingTime = tokenCacheTime;

    // Set the IssuedTokenRenewalThresholdPercentage property
    cf.Credentials.IssuedToken.IssuedTokenRenewalThresholdPercentage = renewalPercentage;

    // Set the DefaultKeyEntropyMode property
    cf.Credentials.IssuedToken.DefaultKeyEntropyMode = entropyMode;
}

' This method configures the IssuedToken property of the Credentials property of a proxy/channel factory
Public Shared Sub ConfigureIssuedTokenClientCredentials(ByVal cf As ChannelFactory, _
                                                        ByVal cacheTokens As Boolean, _
                                                        ByVal tokenCacheTime As TimeSpan, _
                                                        ByVal renewalPercentage As Integer, _
                                                        ByVal entropyMode As SecurityKeyEntropyMode)
    If cf Is Nothing Then
        Throw New ArgumentNullException("ChannelFactory")
    End If
    ' Set the CacheIssuedTokens property
    With cf.Credentials.IssuedToken
        .CacheIssuedTokens = cacheTokens

        ' Set the MaxIssuedTokenCachingTime property
        .MaxIssuedTokenCachingTime = tokenCacheTime

        ' Set the IssuedTokenRenewalThresholdPercentage property
        .IssuedTokenRenewalThresholdPercentage = renewalPercentage

        ' Set the DefaultKeyEntropyMode property
        .DefaultKeyEntropyMode = entropyMode
    End With
End Sub

Zabezpečení rozhraní .NET Framework

Aby se zabránilo možnému zpřístupnění informací, klienti, kteří používají nástroj Svcutil.exe ke zpracování metadat z federovaných koncových bodů, by měli zajistit, aby výsledné adresy služby tokenů zabezpečení byly to, co očekávají. To je zvlášť důležité, když služba tokenů zabezpečení zveřejňuje více koncových bodů, protože nástroj Svcutil.exe vygeneruje výsledný konfigurační soubor pro použití prvního takového koncového bodu, což nemusí být ten, který by měl klient používat.

LocalIssuer Required

Pokud se očekává, že klienti budou vždy používat místního vystavitele, mějte na paměti následující: výchozí výstup Svcutil.exe vede k tomu, že se místní vystavitel nepoužívá, pokud služba tokenu zabezpečení druhého k poslednímu v řetězci určuje adresu vystavitele nebo adresu metadat vystavitele.

Další informace o nastavení , a vlastnosti IssuedTokenClientCredential třídy naleznete v tématu Postupy: Konfigurace místního vystavitele.LocalIssuerChannelBehaviors LocalIssuerBindingLocalIssuerAddress

Certifikáty s vymezeným oborem

Pokud musí být zadány certifikáty služby pro komunikaci s některou ze služeb tokenů zabezpečení, obvykle kvůli tomu, že se nepoužívá vyjednávání certifikátů, lze je zadat pomocí ScopedCertificates vlastnosti X509CertificateRecipientClientCredential třídy. Metoda SetDefaultCertificate přebírá Uri a jako X509Certificate2 parametry. Zadaný certifikát se používá při komunikaci s koncovými body v zadaném identifikátoru URI. Alternativně můžete pomocí SetScopedCertificate metody přidat certifikát do kolekce vrácené ScopedCertificates vlastností.

Poznámka:

Myšlenka klienta certifikátů, které jsou vymezeny na daný identifikátor URI, se vztahuje pouze na aplikace, které provádějí odchozí volání služeb, které zpřístupňují koncové body v těchto identifikátorech URI. Nevztahuje se na certifikáty, které se používají k podepisování vydaných tokenů, jako jsou například certifikáty nakonfigurované na serveru v kolekci vrácené KnownCertificates IssuedTokenServiceCredential třídou. Další informace najdete v tématu Postupy: Konfigurace přihlašovacích údajů ve službě FS (Federation Service).

Viz také