Dela via


Anvisningar: Skapa en federerad klient

I Windows Communication Foundation (WCF) består skapandet av en klient för en federerad tjänst av tre huvudsteg:

  1. Konfigurera en wsFederationHttpBinding eller liknande anpassad bindning>.< Mer information om hur du skapar en lämplig bindning finns i Så här skapar du en WSFederationHttpBinding. Alternativt kan du köra verktyget ServiceModel Metadata Utility (Svcutil.exe) mot metadataslutpunkten för den federerade tjänsten för att generera en konfigurationsfil för kommunikation med den federerade tjänsten och en eller flera tjänster för säkerhetstoken.

  2. Ange egenskaperna för som IssuedTokenClientCredential styr olika aspekter av en klients interaktion med en säkerhetstokentjänst.

  3. Ange egenskaperna för X509CertificateRecipientClientCredential, som gör att certifikat som behövs för att kommunicera säkert med angivna slutpunkter, till exempel tjänster för säkerhetstoken.

Kommentar

En CryptographicException kan genereras när en klient använder personifierade autentiseringsuppgifter, bindningen WSFederationHttpBinding eller en anpassad token och asymmetriska nycklar. Asymmetriska nycklar används med bindningen WSFederationHttpBinding och anpassade token när IssuedKeyType egenskaperna och KeyType är inställda på AsymmetricKey. CryptographicException Utlöses när klienten försöker skicka ett meddelande och det inte finns någon användarprofil för den identitet som klienten personifierar. Du kan åtgärda problemet genom att logga in på klientdatorn eller anropa LoadUserProfile innan du skickar meddelandet.

Det här avsnittet innehåller detaljerad information om dessa procedurer. Mer information om hur du skapar en lämplig bindning finns i Så här skapar du en WSFederationHttpBinding. Mer information om hur en federerad tjänst fungerar finns i Federation.

Så här genererar och undersöker du konfigurationen för en federerad tjänst

  1. Kör verktyget ServiceModel Metadata Utility (Svcutil.exe) med adressen till tjänstens metadata-URL som en kommandoradsparameter.

  2. Öppna den genererade konfigurationsfilen i en lämplig redigerare.

  3. Granska attributen och innehållet för alla genererade utfärdare> och <issuerMetadata-element>.< Dessa finns i säkerhetselementen <> för elementen <wsFederationHttpBinding> eller anpassade bindningar. Kontrollera att adresserna innehåller förväntade domännamn eller annan adressinformation. Det är viktigt att kontrollera den här informationen eftersom klienten autentiserar till dessa adresser och kan avslöja information som användarnamn/lösenordspar. Om adressen inte är den förväntade adressen kan det leda till att information lämnas ut till en oavsiktlig mottagare.

  4. Granska eventuella ytterligare utfärdadeTokenParameters-element> i det kommenterade elementet><alternativeIssuedTokenParameters.< När du använder verktyget Svcutil.exe för att generera konfiguration för en federerad tjänst, om den federerade tjänsten eller någon mellanliggande säkerhetstoken inte anger någon utfärdaradress, utan snarare anger en metadataadress för en säkerhetstokentjänst som exponerar flera slutpunkter, refererar den resulterande konfigurationsfilen till den första slutpunkten. Ytterligare slutpunkter finns i konfigurationsfilen som utkommenterade <alternativeIssuedTokenParameters> element.

    Avgör om en av dessa <issuedTokenParameters> är att föredra framför den som redan finns i konfigurationen. Klienten kanske till exempel föredrar att autentisera till en säkerhetstokentjänst med en Windows CardSpace-token i stället för ett användarnamn/lösenordspar.

    Kommentar

    Om flera tjänster för säkerhetstoken måste passeras innan de kommunicerar med tjänsten är det möjligt för en mellanliggande säkerhetstokentjänst att dirigera klienten till en felaktig säkerhetstokentjänst. Se därför till att slutpunkten för tjänsten för säkerhetstoken i issuedTokenParameters ><är den förväntade tjänsten för säkerhetstoken och inte en okänd säkerhetstokentjänst.

Så här konfigurerar du en IssuedTokenClientCredential i kod

  1. IssuedTokenClientCredential Få åtkomst till genom IssuedToken -egenskapen för ClientCredentials klassen (returneras av ClientCredentials egenskapen ClientBase<TChannel> för klassen eller genom ChannelFactory klassen), som du ser i följande exempelkod.

    IssuedTokenClientCredential itcc = client.ClientCredentials.IssuedToken;
    
    Dim itcc As IssuedTokenClientCredential = client.ClientCredentials.IssuedToken
    
  2. Om tokencachelagring inte krävs anger du CacheIssuedTokens egenskapen till false. Egenskapen CacheIssuedTokens styr om sådana token från en säkerhetstokentjänst cachelagras. Om den här egenskapen är inställd falsepå begär klienten en ny token från säkerhetstokentjänsten när den måste autentisera sig till den federerade tjänsten igen, oavsett om en tidigare token fortfarande är giltig. Om den här egenskapen är inställd truepå återanvänder klienten en befintlig token när den måste autentisera sig på nytt till den federerade tjänsten (så länge token inte har upphört att gälla). Standardvärdet är true.

  3. Om en tidsgräns krävs för cachelagrade token anger du MaxIssuedTokenCachingTime egenskapen till ett TimeSpan värde. Egenskapen anger hur länge en token kan cachelagras. När det angivna tidsintervallet har förflutit tas token bort från klientcachen. Som standard cachelagras token på obestämd tid. I följande exempel anges tidsintervallet till 10 minuter.

    itcc.MaxIssuedTokenCachingTime = new TimeSpan(0, 10, 0);
    
    itcc.MaxIssuedTokenCachingTime = New TimeSpan(0, 10, 0)
    
  4. Valfritt. IssuedTokenRenewalThresholdPercentage Ange till en procentsats. Standardvärdet är 60 (procent). Egenskapen anger en procentandel av tokens giltighetsperiod. Om den utfärdade token till exempel är giltig i 10 timmar och IssuedTokenRenewalThresholdPercentage är inställd på 80 förnyas token efter åtta timmar. I följande exempel anges värdet till 80 procent.

    itcc.IssuedTokenRenewalThresholdPercentage = 80;
    
    itcc.IssuedTokenRenewalThresholdPercentage = 80
    

    Förnyelseintervallet som bestäms av tokens giltighetsperiod och IssuedTokenRenewalThresholdPercentage värdet åsidosätts av MaxIssuedTokenCachingTime värdet i de fall då cachelagringstiden är kortare än förnyelsetröskeltiden. Om till exempel produkten av IssuedTokenRenewalThresholdPercentage och tokens varaktighet är åtta timmar och MaxIssuedTokenCachingTime värdet är 10 minuter kontaktar klienten säkerhetstokentjänsten för en uppdaterad token var 10:e minut.

  5. Om ett annat nyckelentropiläge än CombinedEntropy vad som behövs för en bindning som inte använder meddelandesäkerhet eller transportsäkerhet med autentiseringsuppgifter för meddelanden (t.ex. att bindningen inte har en SecurityBindingElement), anger du DefaultKeyEntropyMode egenskapen till ett lämpligt värde. Entropiläget avgör om symmetriska nycklar kan styras med hjälp av DefaultKeyEntropyMode egenskapen . Standardvärdet är CombinedEntropy, där både klienten och tokenutfärdaren tillhandahåller data som kombineras för att skapa den faktiska nyckeln. Andra värden är ClientEntropy och ServerEntropy, vilket innebär att hela nyckeln anges av klienten eller servern. I följande exempel anges egenskapen till att endast använda serverdata för nyckeln.

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

    Kommentar

    Om en SecurityBindingElement finns i en tjänst- eller tjänstbindning för säkerhetstoken åsidosätts KeyEntropyMode den DefaultKeyEntropyMode angivna IssuedTokenClientCredential av egenskapen SecurityBindingElementför .

  6. Konfigurera eventuella utfärdarspecifika slutpunktsbeteenden genom att lägga till dem i samlingen som returneras av IssuerChannelBehaviors egenskapen.

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

Så här konfigurerar du IssuedTokenClientCredential i konfigurationen

  1. Skapa ett issuedToken-element> som underordnat elementet< issuedToken> i ett slutpunktsbeteende.<

  2. Om tokencachelagring inte krävs anger du cacheIssuedTokens attributet (för elementet><issuedToken) till .false

  3. Om en tidsgräns krävs för cachelagrade token anger du maxIssuedTokenCachingTime attributet för elementet <issuedToken> till ett lämpligt värde. Till exempel:
    <issuedToken maxIssuedTokenCachingTime='00:10:00' />

  4. Om ett annat värde än standardvärdet föredras anger du issuedTokenRenewalThresholdPercentage attributet för elementet <issuedToken> till ett lämpligt värde, till exempel:

    <issuedToken issuedTokenRenewalThresholdPercentage = "80" />  
    
  5. Om ett annat nyckelentropiläge än CombinedEntropy är på en bindning som inte använder meddelandesäkerhet eller transportsäkerhet med autentiseringsuppgifter för meddelanden (t.ex. att bindningen inte har något SecurityBindingElement), anger du defaultKeyEntropyMode attributet för elementet <issuedToken> till antingen ServerEntropy eller ClientEntropy efter behov.

    <issuedToken defaultKeyEntropyMode = "ServerEntropy" />  
    
  6. Valfritt. Konfigurera alla utfärdarspecifika anpassade slutpunktsbeteenden genom att skapa ett <issuerChannelBehaviors> element som underordnat element.<issuedToken> För varje beteende skapar du ett <add> element som underordnat element.<issuerChannelBehaviors> Ange utfärdaradressen för beteendet genom att ange issuerAddress attributet för elementetadd<>. Ange själva beteendet genom att behaviorConfiguration ange attributet för elementetadd<>.

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

Konfigurera en X509CertificateRecipientClientCredential i kod

  1. X509CertificateRecipientClientCredential Få åtkomst till egenskapen ClientCredentials för ServiceCertificate egenskapen för ClientBase<TChannel> klassen eller ChannelFactory egenskapen.

    X509CertificateRecipientClientCredential rcc =
        client.ClientCredentials.ServiceCertificate;
    
    Dim rcc As X509CertificateRecipientClientCredential = _
    client.ClientCredentials.ServiceCertificate
    
  2. Om en X509Certificate2 instans är tillgänglig för certifikatet för en viss slutpunkt använder du Add metoden för samlingen som returneras av ScopedCertificates egenskapen.

    rcc.ScopedCertificates.Add(new Uri("http://fabrikam.com/sts"), cert);
    
    rcc.ScopedCertificates.Add(New Uri("http://fabrikam.com/sts"), cert)
    
  3. Om en X509Certificate2 instans inte är tillgänglig använder du SetScopedCertificate -metoden för X509CertificateRecipientClientCredential klassen enligt följande exempel.

    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"))
    

Konfigurera en X509CertificateRecipientClientCredential i konfigurationen

  1. Skapa ett scopedCertificates-element> som underordnat <till serviceCertificate-elementet> som i sig är underordnat elementet <clientCredentials i ett slutpunktsbeteende>.<

  2. Skapa ett <add> element som underordnat element.<scopedCertificates> Ange värden för attributen storeLocation, storeName, x509FindTypeoch findValue för att referera till lämpligt certifikat. targetUri Ange attributet till ett värde som anger adressen till den slutpunkt som certifikatet ska användas för, enligt följande exempel.

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

Exempel

Följande kodexempel konfigurerar en instans av IssuedTokenClientCredential klassen i koden.

// 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

.NET Framework-säkerhet

För att förhindra att information avslöjas bör klienter som kör verktyget Svcutil.exe för att bearbeta metadata från federerade slutpunkter se till att de resulterande säkerhetstokentjänstadresserna är vad de förväntar sig. Detta är särskilt viktigt när en säkerhetstokentjänst exponerar flera slutpunkter, eftersom verktyget Svcutil.exe genererar den resulterande konfigurationsfilen för att använda den första slutpunkten, som kanske inte är den som klienten ska använda.

LocalIssuer krävs

Om klienterna förväntas alltid använda en lokal utfärdare bör du tänka på följande: standardutdata för Svcutil.exe resulterar i att den lokala utfärdaren inte används om den näst sista säkerhetstokentjänsten i kedjan anger en utfärdaradress eller utfärdarens metadataadress.

Mer information om hur du anger LocalIssuerAddressegenskaperna IssuedTokenClientCredential , LocalIssuerBindingoch för LocalIssuerChannelBehaviors klassen finns i Så här konfigurerar du en lokal utfärdare.

Begränsade certifikat

Om tjänstcertifikat måste anges för kommunikation med någon av säkerhetstjänsterna, vanligtvis eftersom certifikatförhandling inte används, kan de anges med hjälp ScopedCertificates av egenskapen för X509CertificateRecipientClientCredential klassen. Metoden SetDefaultCertificate tar en Uri och en X509Certificate2 som parametrar. Det angivna certifikatet används när du kommunicerar med slutpunkter vid den angivna URI:n. Du kan också använda SetScopedCertificate metoden för att lägga till ett certifikat i samlingen som returneras av ScopedCertificates egenskapen.

Kommentar

Klientidén om certifikat som är begränsade till en viss URI gäller endast för program som gör utgående anrop till tjänster som exponerar slutpunkter vid dessa URI:er. Den gäller inte för certifikat som används för att signera utfärdade token, till exempel de som konfigurerats på servern i samlingen som returneras av KnownCertificatesIssuedTokenServiceCredential klassen. Mer information finns i Så här konfigurerar du autentiseringsuppgifter för en federationstjänst.

Se även