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


Анонимная безопасность сообщения

В примере анонимной службы "Безопасность сообщений" показано, как реализовать приложение Windows Communication Foundation (WCF), использующее безопасность на уровне сообщений без проверки подлинности клиента, но требующее проверки подлинности сервера с помощью сертификата X.509 сервера. Все сообщения приложения между клиентом и сервером подписываются и шифруются. Этот пример основан на примере WSHttpBinding . Этот пример состоит из клиентской консольной программы (.exe) и библиотеки служб (.dll), размещенной службами IIS. Служба реализует контракт, определяющий шаблон связи с запросом и ответом.

Замечание

Процедура установки и инструкции по сборке для этого примера находятся в конце этого раздела.

Этот пример добавляет новую операцию в интерфейс калькулятора, возвращающий True , если клиент не прошел проверку подлинности.

public class CalculatorService : ICalculator
{
    public bool IsCallerAnonymous()
    {
        // ServiceSecurityContext.IsAnonymous returns true if the caller is not authenticated.
        return ServiceSecurityContext.Current.IsAnonymous;
    }
    ...
}

Служба предоставляет одну конечную точку для взаимодействия со службой, определенной с помощью файла конфигурации (Web.config). Конечная точка состоит из адреса, привязки и контракта. Настройка привязки выполняется с использованием привязки wsHttpBinding. Стандартный режим безопасности для привязки wsHttpBinding — это Message. Для clientCredentialType атрибута задано значение None.

<system.serviceModel>

  <protocolMapping>
    <add scheme="http" binding="wsHttpBinding" />
  </protocolMapping>

  <bindings>
    <wsHttpBinding>
     <!-- This configuration defines the security mode as Message and -->
     <!-- the clientCredentialType as None. This mode provides -->
     <!-- server authentication only using the service certificate. -->

     <binding>
       <security mode="Message">
         <message clientCredentialType="None" />
       </security>
     </binding>
    </wsHttpBinding>
  </bindings>
  ...
</system.serviceModel>

Учетные данные, используемые для проверки подлинности службы, указываются в <настройках поведения>. Сертификат сервера должен содержать то же значение, что и значение, SubjectName указанное для атрибута findValue , как показано в следующем примере кода.

<behaviors>
  <serviceBehaviors>
    <behavior>
      <!--
    The serviceCredentials behavior allows you to define a service certificate.
    A service certificate is used by a client to authenticate the service and 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>

Конфигурация конечной точки клиента состоит из абсолютного адреса конечной точки службы, привязки и контракта. Режим безопасности клиента для привязки wsHttpBinding - это Message. Для clientCredentialType атрибута задано значение None.

<system.serviceModel>
  <client>
    <endpoint name=""
             address="http://localhost/servicemodelsamples/service.svc"
             binding="wsHttpBinding"
             behaviorConfiguration="ClientCredentialsBehavior"
             bindingConfiguration="Binding1"
             contract="Microsoft.ServiceModel.Samples.ICalculator" />
  </client>

  <bindings>
    <wsHttpBinding>
      <!--This configuration defines the security mode as -->
      <!--Message and the clientCredentialType as None. -->
      <binding name="Binding1">
        <security mode = "Message">
          <message clientCredentialType="None"/>
        </security>
      </binding>
    </wsHttpBinding>
  </bindings>
  ...
</system.serviceModel>

В этом примере CertificateValidationMode устанавливается в PeerOrChainTrust для аутентификации сертификата службы. Это делается в файле App.config клиента в behaviors разделе. Это означает, что если сертификат находится в хранилище доверенных людей пользователя, то он является доверенным, не выполняя проверку цепочки издателей сертификата. Этот параметр используется здесь для удобства, чтобы пример можно было запустить без необходимости предоставления сертификатов, выданных центром сертификации (ЦС). Этот параметр менее безопасный, чем по умолчанию, ChainTrust. Последствия безопасности этого параметра следует тщательно учитывать перед использованием PeerOrChainTrust в рабочем коде.

Реализация клиента добавляет вызов метода IsCallerAnonymous, и в остальном не отличается от примера с WSHttpBinding.

// Create a client with a client endpoint configuration.
CalculatorClient client = new CalculatorClient();

// Call the GetCallerIdentity operation.
Console.WriteLine("IsCallerAnonymous returned: {0}", client.IsCallerAnonymous());

// Call the Add service operation.
double value1 = 100.00D;
double value2 = 15.99D;
double result = client.Add(value1, value2);
Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);

...

//Closing the client gracefully closes the connection and cleans up resources.
client.Close();

Console.WriteLine();
Console.WriteLine("Press <ENTER> to terminate client.");
Console.ReadLine();

При запуске примера запросы и ответы операции отображаются в окне консоли клиента. Нажмите клавишу ВВОД в окне клиента, чтобы завершить работу клиента.

IsCallerAnonymous returned: True
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, включенный в пример "Анонимное сообщение", позволяет настроить сервер с соответствующим сертификатом для запуска размещенного приложения, требующего безопасности на основе сертификатов. Пакетный файл можно запускать в двух режимах. Чтобы запустить пакетный файл в режиме одного компьютера, введите 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 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 ('"%MSSDK%\bin\FindPrivateKey.exe" My LocalMachine -n CN^=%SERVER_NAME% -a') do set PRIVATE_KEY_FILE=%%i set WP_ACCOUNT=NT AUTHORITY\NETWORK SERVICE
    (ver | findstr "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 на ваш региональный эквивалент.

Настройка, сборка и запуск примера

  1. Убедитесь, что вы выполнили процедуру настройки One-Time для образцов Windows Communication Foundation.

  2. Чтобы создать версию решения на C# или Visual Basic .NET, следуйте инструкциям по сборке примеров Windows Communication Foundation .

Запуск примера на том же компьютере

  1. Убедитесь, что путь содержит папку, в которой находятся Makecert.exe и FindPrivateKey.exe.

  2. Запустите Setup.bat из примера папки установки в командной строке разработчика для Visual Studio с правами администратора. При этом устанавливаются все сертификаты, необходимые для выполнения примера.

    Замечание

    Пакетный файл установки предназначен для запуска из командной строки разработчика для Visual Studio. Для этого необходимо, чтобы переменная среды пути указывала на каталог, в котором установлен пакет SDK. Эта переменная среды автоматически устанавливается в командной строке разработчика для Visual Studio.

  3. Проверьте доступ к службе с помощью браузера, введя адрес http://localhost/servicemodelsamples/service.svc.

  4. Запустите Client.exe из \client\bin. Действие клиента отображается в клиентском консольном приложении.

  5. Если клиент и служба не могут взаимодействовать, см. рекомендации по устранению неисправностей для примеров WCF.

Для запуска примера на нескольких компьютерах

  1. Создайте каталог на компьютере службы. Создайте виртуальное приложение с именем servicemodelsamples для этого каталога с помощью средства управления службами IIS.

  2. Скопируйте файлы программы службы из \inetpub\wwwroot\servicemodelsamples в виртуальный каталог на компьютере службы. Убедитесь, что файлы копируются в подкаталоге \bin. Кроме того, скопируйте файлы Setup.bat и Cleanup.bat на компьютер службы.

  3. Создайте каталог на клиентском компьютере для двоичных файлов клиента.

  4. Скопируйте файлы клиентской программы в каталог клиента на клиентском компьютере. Кроме того, скопируйте Setup.bat, Cleanup.batи ImportServiceCert.bat файлы в клиент.

  5. На сервере, в открытой с правами администратора командной строке разработчика для Visual Studio, выполните команду setup.bat service. При выполнении setup.bat с аргументом service создается сертификат службы с полным доменным именем компьютера и экспортируется сертификат службы в файл с именем Service.cer.

  6. Измените web.config, чтобы отразить новое имя сертификата (в атрибуте findValue в <serviceCertificate>), которое совпадает с полным доменным именем компьютера.

  7. Скопируйте файл Service.cer из каталога службы в клиентский каталог на клиентском компьютере.

  8. В файле Client.exe.config на клиентском компьютере измените значение адреса конечной точки на соответствие новому адресу службы.

  9. На клиенте запустите ImportServiceCert.bat в командной строке разработчика для Visual Studio, открывшейся с правами администратора. При этом сертификат службы импортируется из файла Service.cer в хранилище CurrentUser — TrustedPeople.

  10. На клиентском компьютере запустите 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.