Пользовательская конечная точка защищенных метаданных
В примере CustomMexEndpoint показано, как реализовать службу с безопасной конечной точкой метаданных, которая использует одну из привязок обмена метаданными, а также как настроить средство служебной программы метаданных ServiceModel (Svcutil.exe) или клиенты для получения метаданных из такой конечной точки метаданных. Существует две системные привязки для предоставления конечных точек метаданных: mexHttpBinding и mexHttpsBinding. Привязка mexHttpBinding используется для предоставления конечной точки метаданных через HTTP в незащищенном режиме. Привязка mexHttpsBinding используется для предоставления конечной точки метаданных через HTTP в защищенном режиме. В этом образце описывается предоставление защищенной конечной точки метаданных с использованием объекта WSHttpBinding. Такой подход следует использовать, если требуется изменить параметры безопасности привязки, но при этом нежелательно использовать протокол HTTPS. При использовании привязки mexHttpsBinding конечная точка метаданных будет защищена, но изменение параметров привязки окажется невозможным.
Примечание.
Процедура настройки и инструкции по построению для данного образца приведены в конце этого раздела.
Service
Служба в образце имеет две конечные точки. Конечная точка приложения служит в качестве контракта ICalculator
для привязки WSHttpBinding
с включенным сеансом ReliableSession
и режимом безопасности Message
с использованием сертификатов. Конечная точка метаданных также использует привязку WSHttpBinding
с аналогичными параметрами безопасности, но без ReliableSession
. Соответствующая конфигурация представлена ниже.
<services>
<service name="Microsoft.ServiceModel.Samples.CalculatorService"
behaviorConfiguration="CalculatorServiceBehavior">
<!-- use base address provided by host -->
<endpoint address=""
binding="wsHttpBinding"
bindingConfiguration="Binding2"
contract="Microsoft.ServiceModel.Samples.ICalculator" />
<endpoint address="mex"
binding="wsHttpBinding"
bindingConfiguration="Binding1"
contract="IMetadataExchange" />
</service>
</services>
<bindings>
<wsHttpBinding>
<binding name="Binding1">
<security mode="Message">
<message clientCredentialType="Certificate" />
</security>
</binding>
<binding name="Binding2">
<reliableSession inactivityTimeout="00:01:00" enabled="true" />
<security mode="Message">
<message clientCredentialType="Certificate" />
</security>
</binding>
</wsHttpBinding>
</bindings>
Во многих других образцах конечная точка метаданных использует привязку по умолчанию mexHttpBinding
, которая не является безопасной. В данном примере безопасность метаданных обеспечивается с помощью привязки WSHttpBinding
с режимом безопасности Message
. Чтобы клиенты метаданных могли извлекать эти метаданные, они должны быть настроены с соответствующей привязкой. В образце показаны два таких клиента.
Первый клиент использует Svcutil.exe для извлечения метаданных, а также создания клиентского кода и конфигурации во время разработки. Поскольку служба использует для метаданных привязку, отличную от привязки по умолчанию, средство Svcutil.exe необходимо настроить определенным образом, чтобы оно могло получать метаданные из службы с помощью данной привязки.
Второй клиент использует распознаватель MetadataResolver
с целью динамического извлечения метаданных для известного контракта с последующим вызовом операций на динамически создаваемом клиенте.
Клиент Svcutil
При использовании привязки по умолчанию для размещения конечной точки IMetadataExchange
можно запустить Svcutil.exe с указанием адреса этой конечной точки.
svcutil http://localhost/servicemodelsamples/service.svc/mex
И это будет работать. Однако в этом образце для размещения метаданных сервер использует привязку, отличную от привязки по умолчанию. Поэтому средство Svcutil.exe необходимо настроить на использование правильной привязки. Это можно сделать с помощью файла Svcutil.exe.config.
Файл Svcutil.exe.config выглядит как обычный файл конфигурации клиента. Единственными необычными аспектами являются имя и контракт конечной точки клиента:
<endpoint name="http"
binding="wsHttpBinding"
bindingConfiguration="Binding1"
behaviorConfiguration="ClientCertificateBehavior"
contract="IMetadataExchange" />
Имя конечной точки должно совпадать с именем схемы адреса, по которому размещаются метаданные, а контрактом конечной точки должен быть IMetadataExchange
. Таким образом, при запуске команды
svcutil http://localhost/servicemodelsamples/service.svc/mex
выполняется поиск конечной точки с именем "http" и контракта IMetadataExchange
для настройки привязки и поведения при взаимодействии с конечной точкой метаданных. В остальной части файла Svcutil.exe.config в образце определяются конфигурация привязки и учетные данные поведения для соответствия конфигурации сервера конечной точки метаданных.
Чтобы средство Svcutil.exe могло использовать конфигурацию, заданную в файле Svcutil.exe.config, файл Svcutil.exe должен находиться в одном каталоге с файлом конфигурации. Таким образом, необходимо скопировать файл Svcutil.exe из расположения установки в каталог, содержащий файл Svcutil.exe.config. Затем из этого каталога необходимо выполнить следующую команду:
.\svcutil.exe http://localhost/servicemodelsamples/service.svc/mex
В начале ".\" выполняется копия Svcutil.exe в этом каталоге (которая имеет соответствующую конфигурацию Svcutil.exe.config).
Клиент MetadataResolver
Если клиенту известен контракт и способ обращения к метаданным во время разработки, клиент может динамически определять привязку и адрес конечных точек приложения с помощью распознавателя MetadataResolver
. Это демонстрируется в данном образце клиента: показано, как настроить привязку и учетные данные, используемые распознавателем MetadataResolver
, путем создания и настройки клиента MetadataExchangeClient
.
Информацию о привязке и сертификате, указанную в файле Svcutil.exe.config, можно задать императивно в клиенте MetadataExchangeClient
:
// Specify the Metadata Exchange binding and its security mode
WSHttpBinding mexBinding = new WSHttpBinding(SecurityMode.Message);
mexBinding.Security.Message.ClientCredentialType = MessageCredentialType.Certificate;
// Create a MetadataExchangeClient for retrieving metadata, and set the // certificate details
MetadataExchangeClient mexClient = new MetadataExchangeClient(mexBinding);
mexClient.SoapCredentials.ClientCertificate.SetCertificate( StoreLocation.CurrentUser, StoreName.My,
X509FindType.FindBySubjectName, "client.com");
mexClient.SoapCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.PeerOrChainTrust;
mexClient.SoapCredentials.ServiceCertificate.SetDefaultCertificate( StoreLocation.CurrentUser, StoreName.TrustedPeople,
X509FindType.FindBySubjectName, "localhost");
При настроенном клиенте mexClient
можно перечислить требуемые контракты и использовать распознаватель MetadataResolver
для получения списка конечных точек с этими контрактами.
// The contract we want to fetch metadata for
Collection<ContractDescription> contracts = new Collection<ContractDescription>();
ContractDescription contract = ContractDescription.GetContract(typeof(ICalculator));
contracts.Add(contract);
// Find endpoints for that contract
EndpointAddress mexAddress = new EndpointAddress(ConfigurationManager.AppSettings["mexAddress"]);
ServiceEndpointCollection endpoints = MetadataResolver.Resolve(contracts, mexAddress, mexClient);
Наконец, можно использовать информацию из этих конечных точек для инициализации привязки и адреса фабрики ChannelFactory
, используемой для создания каналов взаимодействия с конечными точками приложения.
ChannelFactory<ICalculator> cf = new ChannelFactory<ICalculator>(endpoint.Binding, endpoint.Address);
Основная задача данного образца клиента - показать, что при использовании распознавателя MetadataResolver
и необходимости задания пользовательских привязок или поведений для обмена метаданными можно использовать клиент MetadataExchangeClient
для задания этих пользовательских параметров.
Настройка и сборка образца
Убедитесь, что вы выполнили процедуру однократной установки для примеров Windows Communication Foundation.
Чтобы создать решение, следуйте инструкциям по созданию примеров Windows Communication Foundation.
Запуск образца на том же компьютере
Запустите файл Setup.bat из папки установки примера. При этом устанавливаются все сертификаты, необходимые для выполнения образца. Обратите внимание, что Setup.bat использует средство FindPrivateKey.exe, которое устанавливается путем выполнения setupCertTool.bat из процедуры однократной установки для примеров Windows Communication Foundation.
Запустите клиентское приложение из каталога \MetadataResolverClient\bin или \SvcutilClient\bin. Действия клиента отображаются в консольном приложении клиента.
Если клиент и служба не могут взаимодействовать, ознакомьтесь с Советы устранения неполадок для примеров WCF.
После завершения работы образца запустите файл Cleanup.bat, чтобы удалить сертификаты. В других образцах обеспечения безопасности используются те же сертификаты.
Выполнение примера на нескольких компьютерах
На сервере выполните команду
setup.bat service
. При выполненииsetup.bat
сservice
аргументом создается сертификат службы с полным доменным именем компьютера и экспортируется сертификат службы в файл с именем Service.cer.Измените Web.config на сервере так, чтобы в файле отражалось новое имя сертификата. То есть измените
findValue
атрибут в <элементе serviceCertificate> на полное доменное имя компьютера.Скопируйте файл Service.cer из каталога службы в клиентский каталог на клиентском компьютере.
На клиенте выполните команду
setup.bat client
. При выполненииsetup.bat
client
с аргументом создается сертификат клиента с именем Client.com и экспортируется сертификат клиента в файл с именем Client.cer.В файле App.config клиента
MetadataResolverClient
на клиентском компьютере измените значение адреса конечной точки обмена метаданными, чтобы оно соответствовало новому адресу службы. Для этого замените имя localhost полным именем домена сервера. Кроме того, замените вхождение "localhost" в файле metadataResolverClient.cs новым именем сертификата службы (полным доменным именем сервера). Выполните то же самое для файла App.config проекта SvcutilClient.Скопируйте файл Client.cer из клиентского каталога в каталог службы на сервере.
На клиенте выполните команду
ImportServiceCert.bat
. Он импортирует сертификат службы из файла Service.cer в хранилище CurrentUser - TrustedPeople.На сервере запустите файл
ImportClientCert.bat
. Он импортирует сертификат клиента из файла Client.cer в хранилище LocalMachine - TrustedPeople.На компьютере службы выполните построение проекта службы в Visual Studio и выберите страницу справки в веб-браузере, чтобы проверить что она запущена.
На клиентском компьютере запустите клиент MetadataResolverClient или SvcutilClient из VS.
- Если клиент и служба не могут взаимодействовать, ознакомьтесь с Советы устранения неполадок для примеров WCF.
Очистка после образца
После завершения работы примера запустите в папке примеров файл Cleanup.bat.
Примечание.
Этот скрипт не удаляет сертификаты службы на клиенте при выполнении примера на нескольких компьютерах. Если вы выполнили примеры Windows Communication Foundation (WCF), использующие сертификаты на компьютерах, обязательно снимите сертификаты службы, установленные в хранилище CurrentUser — доверенный Люди. Для этого используйте следующую команду:
certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name>
. Например:certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com
.