Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
В этом примере показано, как реализовать приложение, которое использует WS-Security с проверкой подлинности пользователя для клиента и требует проверки подлинности сервера с помощью сертификата X.509v3 сервера. Все сообщения приложения между клиентом и сервером подписываются и шифруются. По умолчанию имя пользователя и пароль, предоставленные клиентом, используются для входа в действительную учетную запись Windows. Этот пример основан на WSHttpBinding. Этот пример состоит из клиентской консольной программы (Client.exe) и библиотеки служб (Service.dll), размещенной службами IIS. Служба реализует контракт, определяющий шаблон связи с запросом и ответом.
Замечание
Процедура установки и инструкции по сборке для этого примера находятся в конце этого раздела.
В этом примере также демонстрируется следующее:
Сопоставление по умолчанию с учетными записями Windows, чтобы можно было выполнить дополнительную авторизацию.
Как получить доступ к информации о личности вызывающего абонента из служебного кода.
Служба предоставляет одну конечную точку для взаимодействия со службой, которая определяется с помощью файла конфигурации Web.config. Конечная точка состоит из адреса, привязки и контракта. Привязка настроена с помощью стандартного <wsHttpBinding>, который по умолчанию использует безопасность сообщений. Этот пример задает стандартный <wsHttpBinding> для аутентификации по имени пользователя клиента. Поведение указывает, что учетные данные пользователя должны использоваться для проверки подлинности службы. Сертификат сервера должен содержать то же значение имени субъекта, что и findValue атрибут в <serviceCredentials>.
<system.serviceModel>
<protocolMapping>
<add scheme="http" binding="wsHttpBinding" />
</protocolMapping>
<bindings>
<wsHttpBinding>
<!--
This configuration defines the security mode as Message and
the clientCredentialType as Username.
By default, Username authentication attempts to authenticate the provided
username as a Windows computer or domain account.
-->
<binding>
<security mode="Message">
<message clientCredentialType="UserName"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
<!--For debugging purposes set the includeExceptionDetailInFaults attribute to true.-->
<behaviors>
<serviceBehaviors>
<behavior>
<!--
The serviceCredentials behavior allows one to define a service certificate.
A service certificate is used by the service to authenticate itself to the client and to provide message protection.
This configuration references the "localhost" certificate installed during the setup instructions.
-->
<serviceCredentials>
<serviceCertificate findValue="localhost" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />
</serviceCredentials>
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="False" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
Конфигурация конечной точки клиента состоит из абсолютного адреса конечной точки службы, привязки и контракта. Привязка клиента настроена соответствующими securityMode и authenticationMode. При выполнении в межкомпьютерном сценарии адрес конечной точки службы должен быть изменен соответствующим образом.
<system.serviceModel>
<client>
<endpoint address="http://localhost/servicemodelsamples/service.svc"
binding="wsHttpBinding"
bindingConfiguration="Binding1"
behaviorConfiguration="ClientCredentialsBehavior"
contract="Microsoft.ServiceModel.Samples.ICalculator" />
</client>
<bindings>
<wsHttpBinding>
<!--
This configuration defines the security mode as Message and
the clientCredentialType as Username.
-->
<binding name="Binding1">
<security mode="Message">
<message clientCredentialType="UserName"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
<!--For debugging purposes set the includeExceptionDetailInFaults attribute to true.-->
<behaviors>
<endpointBehaviors>
<behavior name="ClientCredentialsBehavior">
<!--
Setting the certificateValidationMode to PeerOrChainTrust means that if the certificate
is in the user's Trusted People store, then it is trusted without performing a
validation of the certificate's issuer chain. This setting is used here for convenience so that the
sample can be run without having to have certificates issued by a certification authority (CA).
This setting is less secure than the default, ChainTrust. The security implications of this
setting should be carefully considered before using PeerOrChainTrust in production code.
-->
<clientCredentials>
<serviceCertificate>
<authentication certificateValidationMode="PeerOrChainTrust" />
</serviceCertificate>
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
Реализация клиента задает имя пользователя и пароль для использования.
// Create a client.
CalculatorClient client = new CalculatorClient();
// Configure client with valid computer or domain account (username,password).
client.ClientCredentials.UserName.UserName = username;
client.ClientCredentials.UserName.Password = password.ToString();
// Call GetCallerIdentity service operation.
Console.WriteLine(client.GetCallerIdentity());
...
//Closing the client gracefully closes the connection and cleans up resources.
client.Close();
При запуске примера запросы и ответы операции отображаются в окне консоли клиента. Нажмите клавишу ВВОД в окне клиента, чтобы завершить работу клиента.
MyMachine\TestAccount
Add(100,15.99) = 115.99
Subtract(145,76.54) = 68.46
Multiply(9,81.25) = 731.25
Divide(22,7) = 3.14285714285714
Press <ENTER> to terminate client.
Пакетный файл Setup.bat, включенный в примеры MessageSecurity, позволяет настроить сервер с соответствующим сертификатом для запуска размещенного приложения, требующего безопасности на основе сертификатов. Пакетный файл можно запускать в двух режимах. Чтобы запустить пакетный файл в режиме одного компьютера, введите setup.bat в командной строке. Чтобы запустить его в режиме обслуживания, выполните setup.bat serviceкоманду . Вы используете этот режим при запуске примера на нескольких компьютерах. Дополнительные сведения см. в процедуре установки в конце этого раздела.
Ниже приведен краткий обзор различных разделов пакетных файлов.
Создание сертификата сервера
Следующие строки из пакетного файла Setup.bat создают используемый сертификат сервера.
echo ************ echo Server cert setup starting echo %SERVER_NAME% echo ************ echo making server cert echo ************ makecert.exe -sr LocalMachine -ss MY -a sha1 -n CN=%SERVER_NAME% -sky exchange -peПеременная %SERVER_NAME% указывает имя сервера. Сертификат хранится в хранилище LocalMachine. Если пакетный файл Setup.bat выполняется с аргументом службы (например
setup.bat service, %SERVER_NAME% содержит полное доменное имя компьютера. В противном случае по умолчанию используется localhost.Установка сертификата сервера в доверенное хранилище сертификатов клиента
В следующей строке сертификат сервера копируется в хранилище доверенных пользователей клиента. Этот шаг необходим, так как сертификаты, созданные Makecert.exe, не являются неявно доверенными клиентской системой. Если у вас уже есть сертификат, который основывается на корневом сертификате, которому доверяет клиент, например, выданный корпорацией Microsoft, то этап добавления серверного сертификата в хранилище клиентских сертификатов не требуется.
certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeopleПредоставление разрешений на закрытый ключ сертификата
Следующие строки в пакетном файле Setup.bat делают сертификат сервера, хранящийся в хранилище LocalMachine, доступным для учетной записи рабочего процесса ASP.NET.
echo ************ echo setting privileges on server certificates echo ************ for /F "delims=" %%i in ('"%ProgramFiles%\ServiceModelSampleTools\FindPrivateKey.exe" My LocalMachine -n CN^=%SERVER_NAME% -a') do set PRIVATE_KEY_FILE=%%i set WP_ACCOUNT=NT AUTHORITY\NETWORK SERVICE (ver | findstr /C:"5.1") && set WP_ACCOUNT=%COMPUTERNAME%\ASPNET echo Y|cacls.exe "%PRIVATE_KEY_FILE%" /E /G "%WP_ACCOUNT%":R iisresetЗамечание
Если вы используете неамериканскую англоязычную версию Windows, вы должны изменить файл Setup.bat и заменить в имени учетной записи
NT AUTHORITY\NETWORK SERVICEна ваш региональный эквивалент.
Настройка, сборка и запуск примера
Убедитесь, что вы выполнили процедуру настройки One-Time для образцов Windows Communication Foundation.
Чтобы создать версию решения на C# или Visual Basic .NET, следуйте инструкциям по сборке примеров Windows Communication Foundation .
Запуск примера на том же компьютере
Убедитесь, что путь содержит папку, в которой находятся Makecert.exe и FindPrivateKey.exe.
Запустите Setup.bat из примера папки установки в командной строке разработчика для Visual Studio, открытой с правами администратора. При этом устанавливаются все сертификаты, необходимые для выполнения примера.
Замечание
Пакетный файл Setup.bat предназначен для запуска из командной строки разработчика для Visual Studio. Для этого необходимо, чтобы переменная среды пути указывала на каталог, в котором установлен пакет SDK. Эта переменная среды автоматически устанавливается в командной строке разработчика для Visual Studio.
Проверьте доступ к службе с помощью браузера, введя адрес
http://localhost/servicemodelsamples/service.svc.Запустите Client.exe из \client\bin. Действие клиента отображается в клиентском консольном приложении.
Если клиент и служба не могут взаимодействовать, см. рекомендации по устранению неисправностей для примеров WCF.
Для запуска примера на нескольких компьютерах
Создайте каталог на компьютере службы. Создайте виртуальное приложение с именем servicemodelsamples для этого каталога с помощью средства управления службами Internet Information Services.
Скопируйте файлы программы службы из \inetpub\wwwroot\servicemodelsamples в виртуальный каталог на компьютере службы. Убедитесь, что файлы копируются в подкаталоге \bin. Кроме того, скопируйте файлы Setup.bat и Cleanup.bat на компьютер службы.
Создайте каталог на клиентском компьютере для двоичных файлов клиента.
Скопируйте файлы клиентской программы в каталог клиента на клиентском компьютере. Кроме того, скопируйте Setup.bat, Cleanup.batи ImportServiceCert.bat файлы в клиент.
На сервере, в открытой с правами администратора командной строке разработчика для Visual Studio, выполните команду
setup.bat service. При выполненииsetup.batс аргументомserviceсоздается сертификат службы с полным доменным именем компьютера и экспортируется сертификат службы в файл с именем Service.cer.Измените Web.config, чтобы отразить новое имя сертификата (в атрибуте findValue в элементе serviceCertificate), которое совпадает с полным доменным именем компьютера.
.Скопируйте файл Service.cer из каталога службы в клиентский каталог на клиентском компьютере.
В файле Client.exe.config на клиентском компьютере измените значение адреса конечной точки на соответствие новому адресу службы.
На клиенте запустите ImportServiceCert.bat в командной строке разработчика для Visual Studio, открывшейся с правами администратора. При этом сертификат службы импортируется из файла Service.cer в хранилище CurrentUser — TrustedPeople.
На клиентском компьютере запустите Client.exe из командной строки. Если клиент и служба не могут взаимодействовать, см. рекомендации по устранению неисправностей для примеров WCF.
Очистка после образца
Запустите Cleanup.bat в папке примеров после завершения выполнения примера.
Замечание
Этот скрипт не удаляет сертификаты службы на клиенте при запуске этого примера на компьютерах. Если вы запускали примеры из Windows Communication Foundation (WCF), использующие сертификаты на нескольких компьютерах, обязательно удалите сертификаты службы, установленные в хранилище CurrentUser — TrustedPeople. Для этого используйте следующую команду:
certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name>Например,certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com.