Практическое руководство. Создание WSFederationHttpBinding

В Windows Communication Foundation (WCF) WSFederationHttpBinding класс (<wsFederationHttpBinding> в конфигурации) предоставляет механизм предоставления федеративной службы. т. е. к службе, требующей проверки подлинности клиентов с использованием маркера безопасности, выданного службой маркеров безопасности. В этом разделе показано, как настраивать привязку WSFederationHttpBinding в коде и в конфигурации. После создания привязки можно настроить конечную точку на использование этой привязки.

Ниже перечислены основные шаги.

  1. Выберите режим безопасности. Привязка WSFederationHttpBinding поддерживает режим Message, обеспечивающий сквозную защиту на уровне сообщений даже при нескольких переходах, а также режим TransportWithMessageCredential, который повышает производительность в случаях, когда клиент и служба могут напрямую подключаться друг к другу с помощью протокола HTTPS.

    Примечание.

    Кроме того, привязка WSFederationHttpBinding поддерживает режим безопасности None. Этот режим небезопасен и поддерживается только в целях отладки. Если конечная точка службы развернута с WSFederationHttpBinding заданным режимом Noneбезопасности, результирующая привязка клиента (созданная средством служебной программы метаданных ServiceModel (Svcutil.exe)) является WSHttpBinding режимом Noneбезопасности.

    В отличие от других предоставляемых системой привязок, при использовании привязки WSFederationHttpBinding нет необходимости выбирать тип учетных данных клиента. Это связано с тем, что типом учетных данных клиента всегда является выданный токен. WCF получает маркер от указанного издателя и представляет этот маркер службе для проверки подлинности клиента.

  2. В федеративных клиентах присвойте свойству IssuerAddress URL-адрес службы маркеров безопасности. Задайте в качестве свойства IssuerBinding привязку, которая должна использоваться для взаимодействия со службой маркеров безопасности.

  3. Необязательно. Задайте в качестве свойства IssuedTokenType универсальный код ресурса (URI) типа маркера. В федеративных службах укажите ожидаемый службой тип маркера. В федеративных клиентах укажите тип маркера, запрашиваемый клиентом у службы маркеров безопасности.

    Если тип маркера не задан, клиенты создают маркеры безопасности запросов (RST) WS-Trust без универсального кода ресурса (URI) типа маркера, а служба по умолчанию ожидает проверки подлинности клиента с использованием маркера SAML 1.1.

    Универсальный код ресурса (URI) для токена http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1SAML 1.1.

  4. Необязательно. В федеративных службах присвойте свойству IssuerMetadataAddress URL-адрес метаданных службы маркеров безопасности. Конечная точка метаданных позволяет клиентам службы выбрать соответствующую пару «привязка - конечная точка», если служба настроена на публикацию метаданных. Дополнительные сведения о публикации метаданных см. в разделе "Публикация метаданных".

Можно также задать другие свойства, в том числе тип ключа, используемого в качестве ключа проверки в выданном маркере, набор алгоритмов для взаимодействия между клиентом и службой, необходимость согласования или явного задания учетных данных службы, конкретные утверждения, которые служба ожидает получить в выданном маркере, а также любые дополнительные элементы XML, которые необходимо добавить в запрос, отправляемый клиентом службе маркеров безопасности.

Примечание.

Свойство NegotiateServiceCredential используется только в том случае, если SecurityMode имеет значение Message. Если SecurityMode имеет значение TransportWithMessageCredential, свойство NegotiateServiceCredential игнорируется.

Настройка привязки WSFederationHttpBinding в коде

  1. Создайте экземпляр WSFederationHttpBinding.

  2. Присвойте свойству Mode значение WSFederationHttpSecurityMode или Message в зависимости от необходимости. Если набор алгоритмов, отличный от Basic256 обязательных, задайте AlgorithmSuite для свойства значение, взятое из SecurityAlgorithmSuite.

  3. Задайте свойство NegotiateServiceCredential в зависимости от необходимости.

  4. IssuedKeyType Задайте для свойства SecurityKeyTypeSymmetricKey значение или .AsymmetricKey по мере необходимости.

  5. Присвойте свойству IssuedTokenType соответствующее значение. Если значение не задано, WCF по умолчанию http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1использует маркеры SAML 1.1.

  6. Является обязательным для клиента, если не задан локальный издатель; для службы является необязательным. Создайте объект EndpointAddress, содержащий адрес и сведения об удостоверении службы маркеров безопасности и присвойте экземпляр EndpointAddress свойству IssuerAddress.

  7. Является обязательным для клиента, если не задан локальный издатель; для службы не используется. Binding Создайте экземпляр и SecurityTokenService назначьте Binding экземпляр свойствуIssuerBinding.

  8. Не используется для клиента; является необязательным для службы. Создайте экземпляр EndpointAddress для метаданных службы маркеров безопасности и присвойте его свойству IssuerMetadataAddress.

  9. Является необязательным как для клиента, так и для службы. Создайте и добавьте один или более экземпляров ClaimTypeRequirement в коллекцию, возвращаемую свойством ClaimTypeRequirements.

  10. Является необязательным как для клиента, так и для службы. Создайте и добавьте один или более экземпляров XmlElement в коллекцию, возвращаемую свойством TokenRequestParameters.

Создание федеративной конечной точки в конфигурации

  1. Создайте wsFederationHttpBinding> в качестве дочернего <элемента привязки> в файле конфигурации приложения.<

  2. Создайте элемент привязки> в качестве дочернего< элемента wsFederationHttpBinding> и задайте name атрибут соответствующим значением.<

  3. <security> Создайте элемент в качестве дочернего элемента привязки<>.

  4. Задайте для атрибута mode элемента <security> значение Message или TransportWithMessageCredential в зависимости от необходимости.

  5. Создайте элемент <message>, являющийся дочерним для элемента <security>.

  6. Необязательно. Задайте соответствующее значение атрибута algorithmSuite элемента <message>. Значение по умолчанию — Basic256.

  7. Необязательно. Если требуется асимметричный ключ проверки, задайте для атрибута issuedKeyType элемента <message> значение AsymmetricKey. Значение по умолчанию — SymmetricKey.

  8. Необязательно. Задайте значение атрибута issuedTokenType элемента <message>.

  9. Является обязательным для клиента, если не задан локальный издатель; для службы является необязательным. Создайте элемент <issuer>, являющийся дочерним для элемента <message>.

  10. Задайте атрибут address элемента <issuer> и укажите адрес, по которому служба маркеров безопасности принимает запросы маркеров.

  11. Необязательно. Добавьте дочерний элемент <identity> и задайте удостоверение службы маркеров безопасности.

  12. Дополнительные сведения см. в разделе "Удостоверение службы" и "Проверка подлинности".

  13. Является обязательным для клиента, если не задан локальный издатель; для службы не используется. <Создайте элемент привязки в разделе привязок>, который можно использовать для взаимодействия со службой маркеров безопасности. Дополнительные сведения о создании привязки см. в разделе "Практическое руководство. Указание привязки службы в конфигурации".

  14. Укажите привязку, созданную на предыдущем этапе, задав атрибуты binding и bindingConfiguration элемента <issuer>.

  15. Не используется для клиента; является необязательным для службы. Создайте элемент <issuerMetadata>, являющийся дочерним для элемента <message>. Затем в атрибуте address элемента <issuerMetadata> укажите адрес, по которому служба маркеров безопасности должна опубликовать свои метаданные. Добавьте дочерний элемент <identity> и задайте удостоверение службы маркеров безопасности (необязательно).

  16. Является необязательным как для клиента, так и для службы. Добавьте элемент <claimTypeRequirements> в качестве дочернего элемента для элемента <message>. Укажите обязательные и необязательные утверждения, которые служба использует, добавив <>элементы в <claimTypeRequirements> элемент и указав тип утверждения атрибутом.claimType С помощью атрибута isOptional укажите, является ли то или иное утверждение обязательным.

Пример

Ниже приведен пример кода принудительной настройки привязки 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

См. также