Поделиться через


Как создать WSFederationHttpBinding

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

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

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

    Aa347982.note(ru-ru,VS.100).gifПримечание
    Кроме того, привязка WSFederationHttpBinding поддерживает режим безопасности None. Этот режим небезопасен и поддерживается только в целях отладки. Если при развертывании конечной точки службы для привязки WSFederationHttpBinding задан режим безопасности None, для клиента будет создана (с помощью средства Служебное средство ServiceModel Metadata Utility Tool (Svcutil.exe)) привязка WsHttpBinding с режимом безопасности None.

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

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

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

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

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

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

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

Aa347982.note(ru-ru,VS.100).gifПримечание
Свойство NegotiateServiceCredential используется только в том случае, если SecurityMode имеет значение Message. Если SecurityMode имеет значение TransportWithMessageCredential, свойство NegotiateServiceCredential игнорируется.

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

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

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

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

  4. Присвойте свойству IssuedKeyType значение SecurityKeyType. SymmetricKey или 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 element, являющийся дочерним для элемента <bindings>.

  2. Создайте элемент binding, являющийся дочерним для элемента wsFederationHttpBinding element, и задайте соответствующее значение атрибута name.

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

  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. Является обязательным для клиента, если не задан локальный издатель; для службы не используется. Создайте в разделе привязок элемент <binding> с привязкой, которую можно будет использовать для взаимодействия со службой маркеров безопасности. Дополнительные сведения создании привязки см. в разделе Как задать привязку службы в конфигурации.

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

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

  16. Является необязательным как для клиента, так и для службы. Добавьте элемент <claimTypeRequirements> в качестве дочернего элемента для элемента <message>. Укажите обязательные и необязательные утверждения для службы, добавив элементы <add> of <claimTypeRequirements> в элемент <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("https://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("https://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;
}

См. также

Задачи

Образец федерации
Как упорядочить отключения безопасных сеансов в WSFederationHttpBinding

Основные понятия

Федерация