Проверка подлинности для канала TCP

Этот раздел относится к технологии прежних версий, которая сохраняется для обеспечения обратной совместимости с существующими приложениями и не рекомендуется для разработки новых приложений. Сейчас распределенные приложения следует создавать с помощью  Windows Communication Foundation (WCF).

Канал TCP явным образом поддерживает проверку подлинности и олицетворение. В этом разделе описано, как настроить каналы клиента и сервера.

Платформа .NET Framework позволяет серверам с удаленными объектами осуществлять проверку подлинности и олицетворение вызывающих объектов путем задания свойств, связанных с объектами TcpServerChannel и TcpClientChannel.

Конфигурация сервера

Чтобы настроить канал TCP сервера на проверку подлинности удаленных вызывающих объектов, присвойте свойству secure канала TCP значение true, как показано в следующем файле конфигурации.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.runtime.remoting>
        <application>
            <channels>
              <channel ref="tcp" secure="true" />
             </channels>
        </application>
    </system.runtime.remoting>
</configuration>
59hafwyt.note(ru-ru,VS.100).gifПримечание
Свойство secure канала клиента также должно иметь значение true, чтобы могло иметь место безопасное взаимодействие. По умолчанию безопасное взаимодействие включает проверку подлинности и шифрование данных, которыми обмениваются сервер и клиент.

Удостоверение прошедшего проверку подлинности клиента можно получить, обратившись к свойству CurrentPrincipal, а затем к его свойству Identity. Удостоверение олицетворяемого клиента можно получить с помощью метода GetCurrent. При необходимости можно выполнить собственную проверку подлинности.

Чтобы настроить канал TCP сервера на проверку подлинности и олицетворение удаленных вызывающих объектов, присвойте свойствам secure и impersonate значение true, как показано в следующем файле конфигурации.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.runtime.remoting>
        <application>
            <channels>
              <channel ref="tcp" secure="true" impersonate="true" />
             </channels>
        </application>
    </system.runtime.remoting>
</configuration>
59hafwyt.note(ru-ru,VS.100).gifПримечание
Для олицетворения свойство tokenImpersonationLevel канала клиента должно иметь значение impersonation или delegation. Обратите внимание, что на сервере свойство имеет имя impersonate, а на клиенте свойству tokenImpersonationLevel присваивается значение impersonation.

59hafwyt.note(ru-ru,VS.100).gifПримечание
Все процессы выполняются в Windows Vista от имени учетной записи обычного пользователя. Обычные пользователи не могут олицетворять учетную запись администратора. Если приложение, поддерживающее удаленное взаимодействие, должно олицетворять учетную запись администратора, оно должно выполняться с более высоким уровнем привилегий.

Свойство authorizationModule позволяет серверу выполнять собственную авторизацию. Чтобы использовать это свойство, необходимо создать класс, реализующий интерфейс IAuthorizeRemotingConnection. Этот интерфейс содержит следующие методы:

  • метод IsConnectingEndpointAuthorized, позволяющий выполнять авторизацию клиента по IP-адресу;

  • метод IsConnectingIdentityAuthorized, позволяющий выполнять авторизацию клиента по удостоверению.

В файле конфигурации сервера задается свойство authorizationModule для класса, реализующего интерфейс IAuthorizeRemotingConnection, в строке в форме «пространство_имен.класс, сборка», как показано в следующем файле конфигурации.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.runtime.remoting>
    <application name="AuthorizationApp">
      <service>
        <wellknown mode="SingleCall"
                   type="Server.SampleService, Server"
                   objectUri="Server.rem"/>
      </service>

      <channels>
        <channel ref="tcp" port="8001" secure="true" impersonate="true" authorizationModule="Server.AuthorizationModule,Server"/>
      </channels>
    </application>
  </system.runtime.remoting>
</configuration>

Конфигурация клиента

Чтобы настроить канал TCP клиента на проверку подлинности вызывающих объектов, присвойте свойству secure канала TCP значение true, как показано в следующем файле конфигурации.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.runtime.remoting>
        <application>
            <channels>
              <channel ref="tcp" secure="true" />
             </channels>
        </application>
    </system.runtime.remoting>
</configuration>
59hafwyt.note(ru-ru,VS.100).gifПримечание
Свойство secure канала сервера также должно иметь значение true, чтобы могло иметь место безопасное взаимодействие. По умолчанию безопасное взаимодействие включает проверку подлинности и шифрование данных, которыми обмениваются сервер и клиент.

Чтобы настроить канал TCP клиента на использование олицетворения, присвойте свойству secure значение true, а свойству tokenImpersonationLevel — значение impersonation, как показано в следующем файле конфигурации.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.runtime.remoting>
        <application>
            <channels>
              <channel ref="tcp" secure="true" tokenImpersonationLevel="impersonation"/>
             </channels>
        </application>
    </system.runtime.remoting>
</configuration>
59hafwyt.note(ru-ru,VS.100).gifПримечание
Для олицетворения свойство impersonate канала сервера должно иметь значение true. Обратите внимание, что на сервере свойство имеет имя impersonate, а на клиенте свойству tokenImpersonationLevel присваивается значение impersonation.

59hafwyt.note(ru-ru,VS.100).gifПримечание
Все процессы выполняются в Windows Vista от имени учетной записи обычного пользователя. Обычные пользователи не могут олицетворять учетную запись администратора. Если приложение, поддерживающее удаленное взаимодействие, должно олицетворять учетную запись администратора, оно должно выполняться с более высоким уровнем привилегий.

Свойству tokenImpersonationLevel можно присвоить одно из значений, перечисленных в приведенной ниже таблице.

Значение tokenImpersonationLevel Описание

Identification

Сервер может получать информацию о клиенте, например, идентификаторы и привилегии безопасности, но не может олицетворять клиента.

Impersonation

Сервер может олицетворять контекст безопасности клиента в своей локальной системе. Олицетворение клиента сервером в удаленных системах невозможно.

Delegation

Олицетворение клиента сервером в удаленных системах возможно.

По умолчанию канал TCP клиента проверяет свою подлинность, используя удостоверение пользователя, от имени которого выполняется процесс клиента. Можно также указать другое удостоверение, задав значения свойств domain, username и password, как показано в следующем примере кода.

RemotingConfiguration.Configure("Client.exe.config", true);
ISharedInterface remoteObject = (ISharedInterface)Activator.GetObject(
                typeof(ISharedInterface),
                "tcp://localhost:8001/server.rem");

// Set domain, username, and password
IDictionary props = ChannelServices.GetChannelSinkProperties(remoteObject);
props["domain"] = "SomeDomain"; // only required if the user is a member of a domain
props["username"] = "SomeRemotingUser";
props["password"] = "Password123";

// Call method on remote object
remoteObject.HelloWorld("Hi Server");

Кроме того, можно задать свойства domain, username и password в файле конфигурации.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.runtime.remoting>
        <application>
            <channels>
              <channel ref="tcp" 
                       secure="true" 
                       tokenImpersonationLevel="impersonation"
                       username="SomeRemotingUser"
                       password="Password123"
                       />
             </channels>
        </application>
    </system.runtime.remoting>
</configuration>
59hafwyt.note(ru-ru,VS.100).gifПримечание
Не рекомендуется жестко задавать имена пользователей и пароли в коде или файле конфигурации. В данных примерах это делается только для иллюстрации. Лучший способ получить учетные данные — запросить их у пользователя.

По умолчанию для проверки подлинности вызывающих объектов канал TCP использует протокол NTLM. Чтобы канал использовал протокол Kerberos, присвойте свойству servicePrincipalName имя учетной записи, от имени которой выполняется служба, как показано в следующем файле конфигурации.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.runtime.remoting>
        <application>
            <channels>
              <channel ref="tcp" secure="true" tokenImpersonationLevel="impersonation"
                       servicePrincipalName="MyDomain\MyUserAccount"/>
          </channels>
        </application>
    </system.runtime.remoting>
</configuration>
59hafwyt.note(ru-ru,VS.100).gifПримечание
Для использования протокола Kerberos требуется доступ к серверу Active Directory. Если компьютеры, на которых выполняется программа, не входят в домен Active Directory, используйте протокол NTLM (по умолчанию).

См. также

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

Шифрование и целостность сообщений
Проверка подлинности для канала HTTP
Проверка подлинности для канала IPC