Instrukcje: tworzenie elementu WSFederationHttpBinding
W programie Windows Communication Foundation (WCF) WSFederationHttpBinding klasa (<wsFederationHttpBinding w konfiguracji) udostępnia mechanizm uwidaczniania> usługi federacyjnej. Oznacza to, że usługa, która wymaga od klientów uwierzytelniania przy użyciu tokenu zabezpieczającego wystawionego przez usługę tokenu zabezpieczającego. W tym temacie pokazano, jak skonfigurować WSFederationHttpBinding element w kodzie i konfiguracji. Po utworzeniu powiązania można skonfigurować punkt końcowy do korzystania z tego powiązania.
Podstawowe kroki zostały opisane w następujący sposób:
Wybierz tryb zabezpieczeń. Obsługuje WSFederationHttpBinding element
Message
, który zapewnia kompleksowe zabezpieczenia na poziomie komunikatów, nawet w wielu przeskokach iTransportWithMessageCredential
, co zapewnia lepszą wydajność w przypadkach, gdy klient i usługa mogą nawiązać bezpośrednie połączenie za pośrednictwem protokołu HTTPS.Uwaga
Element WSFederationHttpBinding obsługuje
None
również tryb zabezpieczeń. Ten tryb nie jest bezpieczny i jest udostępniany tylko do celów debugowania. Jeśli punkt końcowy usługi jest wdrażany z WSFederationHttpBinding ustawionym trybemNone
zabezpieczeń na , wynikowe powiązanie klienta (generowane przez narzędzie ServiceModel Metadata Tool (Svcutil.exe)) jest WSHttpBinding elementem z trybemNone
zabezpieczeń .W przeciwieństwie do innych powiązań dostarczonych przez system nie jest konieczne wybranie typu poświadczeń klienta w przypadku korzystania z elementu
WSFederationHttpBinding
. Jest to spowodowane tym, że typ poświadczeń klienta jest zawsze wystawionym tokenem. Program WCF uzyskuje token od określonego wystawcy i przedstawia ten token usłudze w celu uwierzytelnienia klienta.Na klientach federacyjnych ustaw IssuerAddress właściwość na adres URL usługi tokenu zabezpieczającego. IssuerBinding Ustaw wartość na powiązanie, które ma być używane do komunikowania się z usługą tokenu zabezpieczającego.
Opcjonalny. IssuedTokenType Ustaw właściwość na identyfikator URI (Uniform Resource Identifier) typu tokenu. W usługach federacyjnych określ typ tokenu oczekiwany przez usługę. Na klientach federacyjnych określ typ tokenu żądania klienta z usługi tokenu zabezpieczającego.
Jeśli nie określono żadnego typu tokenu, klienci generują tokeny zabezpieczające żądania zaufania WS(RST) bez identyfikatora URI typu tokenu, a usługi oczekują uwierzytelniania klienta przy użyciu tokenu SAML (Security Assertions Markup Language) 1.1 domyślnie.
Identyfikator URI tokenu SAML 1.1 to
http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1
.Opcjonalny. W usługach federacyjnych ustaw IssuerMetadataAddress właściwość na adres URL metadanych usługi tokenu zabezpieczającego. Punkt końcowy metadanych umożliwia klientom usługi wybranie odpowiedniej pary powiązania/punktu końcowego, jeśli usługa jest skonfigurowana do publikowania metadanych. Aby uzyskać więcej informacji na temat publikowania metadanych, zobacz Publikowanie metadanych.
Można również ustawić inne właściwości, w tym typ klucza używanego jako klucz dowodowy w wystawionym tokenie, zestaw algorytmów do użycia między klientem a usługą, niezależnie od tego, czy negocjować, czy jawnie określić poświadczenia usługi, wszelkie określone oświadczenia, które usługa oczekuje, że wystawiony token ma zawierać, oraz wszelkie dodatkowe elementy XML, które muszą zostać dodane do żądania, które klient wysyła do usługi tokenu zabezpieczającego.
Uwaga
Właściwość NegotiateServiceCredential
jest istotna tylko wtedy, gdy właściwość jest ustawiona SecurityMode
na Message
wartość . Jeśli SecurityMode
jest ustawiona TransportWithMessageCredential
wartość NegotiateServiceCredential
, właściwość jest ignorowana.
Aby skonfigurować element WSFederationHttpBinding w kodzie
Utwórz wystąpienie elementu WSFederationHttpBinding.
Ustaw właściwość na WSFederationHttpSecurityMode lub Message zgodnie z Mode potrzebami. Jeśli pakiet algorytmów inny niż Basic256 jest wymagany, ustaw AlgorithmSuite właściwość na wartość pobraną z SecurityAlgorithmSuiteklasy .
NegotiateServiceCredential Ustaw odpowiednią właściwość.
IssuedKeyType Ustaw właściwość na SecurityKeyType
SymmetricKey
lub .AsymmetricKey
zgodnie z wymaganiami.IssuedTokenType Ustaw właściwość na odpowiednią wartość. Jeśli żadna wartość nie jest ustawiona, domyślna
http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1
wartość WCF to , która wskazuje tokeny SAML 1.1.Wymagane na kliencie, jeśli nie określono lokalnego wystawcy; opcjonalnie w usłudze. Utwórz obiekt EndpointAddress zawierający informacje o adresie i tożsamości usługi tokenu zabezpieczającego i przypisz EndpointAddress wystąpienie do IssuerAddress właściwości .
Wymagane na kliencie, jeśli nie określono lokalnego wystawcy; nie jest używany w usłudze. Binding Utwórz element dla klasy
SecurityTokenService
i przypisz Binding wystąpienie do IssuerBinding właściwości .Nieużywana na kliencie; opcjonalnie w usłudze. EndpointAddress Utwórz wystąpienie dla metadanych usługi tokenu zabezpieczającego i przypisz je do
IssuerMetadataAddress
właściwości .Opcjonalnie zarówno na kliencie, jak i w usłudze. Utwórz i dodaj co najmniej jedno ClaimTypeRequirement wystąpienie do kolekcji zwróconej ClaimTypeRequirements przez właściwość .
Opcjonalnie zarówno na kliencie, jak i w usłudze. Utwórz i dodaj co najmniej jedno XmlElement wystąpienie do kolekcji zwróconej TokenRequestParameters przez właściwość .
Aby utworzyć federacyjny punkt końcowy w konfiguracji
Utwórz element <wsFederationHttpBinding> jako element podrzędny< elementu bindings> w pliku konfiguracji aplikacji.
Utwórz element powiązania> jako element podrzędny elementu <wsFederationHttpBinding> i ustaw
name
atrybut na odpowiednią wartość.<Utwórz
<security>
element jako element podrzędny <elementu powiązania> .mode
Ustaw atrybut elementu na<security>
wartośćMessage
lubTransportWithMessageCredential
, zgodnie z potrzebami.<message>
Utwórz element jako element podrzędny<security>
elementu.Opcjonalny. Ustaw atrybut na elemecie
algorithmSuite
<message>
z odpowiednią wartością. Wartość domyślna toBasic256
.Opcjonalny. Jeśli wymagany jest klucz dowodu asymetrycznego, ustaw
issuedKeyType
atrybut elementu<message>
naAsymmetricKey
. Wartość domyślna toSymmetricKey
.Opcjonalny.
issuedTokenType
Ustaw atrybut w elemecie<message>
.Wymagane na kliencie, jeśli nie określono lokalnego wystawcy; opcjonalnie w usłudze.
<issuer>
Utwórz element jako element podrzędny<message>
elementu.address
Ustaw atrybut na<issuer>
element i określ adres, pod którym usługa tokenu zabezpieczającego akceptuje żądania tokenu.Opcjonalny. Dodawanie elementu podrzędnego
<identity>
i określanie tożsamości usługi tokenu zabezpieczającegoAby uzyskać więcej informacji, zobacz Service Identity and Authentication (Tożsamość usługi i uwierzytelnianie).
Wymagane na kliencie, jeśli nie określono lokalnego wystawcy; nie jest używany w usłudze. <Utwórz element powiązania> w sekcji powiązania, który może służyć do komunikowania się z usługą tokenu zabezpieczającego. Aby uzyskać więcej informacji na temat tworzenia powiązania, zobacz How to: Specify a Service Binding in Configuration (Instrukcje: określanie powiązania usługi w konfiguracji).
Określ powiązanie utworzone w poprzednim kroku, ustawiając
binding
atrybuty ibindingConfiguration
elementu<issuer>
.Nieużywana na kliencie; opcjonalnie w usłudze.
<issuerMetadata>
Utwórz element jako element podrzędny<message>
elementu. Następnie w atrybucieaddress
elementu określ adres, pod którym usługa tokenu zabezpieczającego<issuerMetadata>
ma opublikować swoje metadane. Opcjonalnie dodaj element podrzędny<identity>
i określ tożsamość usługi tokenu zabezpieczającego.Opcjonalnie zarówno na kliencie, jak i w usłudze.
<claimTypeRequirements>
Dodaj element jako element podrzędny<message>
elementu. Określ wymagane i opcjonalne oświadczenia, na których polega usługa, dodając <>elementy do<claimTypeRequirements>
elementu i określając typ oświadczenia za pomocą atrybutu .claimType
Określ, czy dane oświadczenie jest wymagane, czy opcjonalne, ustawiającisOptional
atrybut.
Przykład
Poniższy przykładowy kod przedstawia kod umożliwiający skonfigurowanie elementu imperatywnego WSFederationHttpBinding
.
// This method creates a WSFederationHttpBinding.
public static WSFederationHttpBinding
CreateWSFederationHttpBinding(bool isClient)
{
// Create an instance of the WSFederationHttpBinding.
WSFederationHttpBinding b = new WSFederationHttpBinding();
// Set the security mode to Message.
b.Security.Mode = WSFederationHttpSecurityMode.Message;
// Set the Algorithm Suite to Basic256Rsa15.
b.Security.Message.AlgorithmSuite = SecurityAlgorithmSuite.Basic256Rsa15;
// Set NegotiateServiceCredential to true.
b.Security.Message.NegotiateServiceCredential = true;
// Set IssuedKeyType to Symmetric.
b.Security.Message.IssuedKeyType = SecurityKeyType.SymmetricKey;
// Set IssuedTokenType to SAML 1.1
b.Security.Message.IssuedTokenType =
"http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#samlv1.1";
// Extract the STS certificate from the certificate store.
X509Store store = new X509Store(StoreName.TrustedPeople, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
X509Certificate2Collection certs = store.Certificates.Find(
X509FindType.FindByThumbprint, "0000000000000000000000000000000000000000", false);
store.Close();
// Create an EndpointIdentity from the STS certificate.
EndpointIdentity identity = EndpointIdentity.CreateX509CertificateIdentity ( certs[0] );
// Set the IssuerAddress using the address of the STS and the previously created
// EndpointIdentity.
b.Security.Message.IssuerAddress =
new EndpointAddress(new Uri("http://localhost:8000/sts/x509"), identity);
// Set the IssuerBinding to a WSHttpBinding loaded from configuration.
// The IssuerBinding is only used on federated clients.
if (isClient)
{
b.Security.Message.IssuerBinding = new WSHttpBinding("Issuer");
}
// Set the IssuerMetadataAddress using the metadata address of the STS and the
// previously created EndpointIdentity. The IssuerMetadataAddress is only used
// on federated services.
else
{
b.Security.Message.IssuerMetadataAddress =
new EndpointAddress(new Uri("http://localhost:8001/sts/mex"), identity);
}
// Create a ClaimTypeRequirement.
ClaimTypeRequirement ctr = new ClaimTypeRequirement
("http://example.org/claim/c1", false);
// Add the ClaimTypeRequirement to ClaimTypeRequirements
b.Security.Message.ClaimTypeRequirements.Add(ctr);
// Return the created binding
return b;
}
' This method creates a WSFederationHttpBinding.
Public Shared Function CreateWSFederationHttpBinding(ByVal isClient As Boolean) As WSFederationHttpBinding
' Create an instance of the WSFederationHttpBinding.
Dim b As New WSFederationHttpBinding()
With b.Security
' Set the security mode to Message.
.Mode = WSFederationHttpSecurityMode.Message
With .Message
' Set the Algorithm Suite to Basic256Rsa15.
.AlgorithmSuite = SecurityAlgorithmSuite.Basic256Rsa15
' Set NegotiateServiceCredential to true.
.NegotiateServiceCredential = True
' Set IssuedKeyType to Symmetric.
.IssuedKeyType = SecurityKeyType.SymmetricKey
' Set IssuedTokenType to SAML 1.1
.IssuedTokenType = "http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#samlv1.1"
End With
End With
' Extract the STS certificate from the certificate store.
Dim store As New X509Store(StoreName.TrustedPeople, StoreLocation.CurrentUser)
store.Open(OpenFlags.ReadOnly)
Dim certs = store.Certificates.Find(X509FindType.FindByThumbprint, _
"0000000000000000000000000000000000000000", _
False)
store.Close()
' Create an EndpointIdentity from the STS certificate.
Dim identity = EndpointIdentity.CreateX509CertificateIdentity(certs(0))
' Set the IssuerAddress using the address of the STS and the previously created
' EndpointIdentity.
With b.Security.Message
.IssuerAddress = New EndpointAddress(New Uri("http://localhost:8000/sts/x509"), _
identity)
' Set the IssuerBinding to a WSHttpBinding loaded from configuration.
' The IssuerBinding is only used on federated clients.
If isClient Then
.IssuerBinding = New WSHttpBinding("Issuer")
' Set the IssuerMetadataAddress using the metadata address of the STS and the
' previously created EndpointIdentity. The IssuerMetadataAddress is only used
' on federated services.
Else
.IssuerMetadataAddress = New EndpointAddress(New Uri("http://localhost:8001/sts/mex"), _
identity)
End If
' Create a ClaimTypeRequirement.
Dim ctr As New ClaimTypeRequirement("http://example.org/claim/c1", _
False)
' Add the ClaimTypeRequirement to ClaimTypeRequirements
.ClaimTypeRequirements.Add(ctr)
End With
' Return the created binding
Return b
End Function