Проверка подлинности для канала 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>
Примечание |
---|
Свойство 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>
Примечание |
---|
Для олицетворения свойство tokenImpersonationLevel канала клиента должно иметь значение impersonation или delegation. Обратите внимание, что на сервере свойство имеет имя impersonate, а на клиенте свойству tokenImpersonationLevel присваивается значение impersonation. |
Примечание |
---|
Все процессы выполняются в 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>
Примечание |
---|
Свойство 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>
Примечание |
---|
Для олицетворения свойство impersonate канала сервера должно иметь значение true. Обратите внимание, что на сервере свойство имеет имя impersonate, а на клиенте свойству tokenImpersonationLevel присваивается значение impersonation. |
Примечание |
---|
Все процессы выполняются в 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>
Примечание |
---|
Не рекомендуется жестко задавать имена пользователей и пароли в коде или файле конфигурации. В данных примерах это делается только для иллюстрации. Лучший способ получить учетные данные — запросить их у пользователя. |
По умолчанию для проверки подлинности вызывающих объектов канал 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>
Примечание |
---|
Для использования протокола Kerberos требуется доступ к серверу Active Directory. Если компьютеры, на которых выполняется программа, не входят в домен Active Directory, используйте протокол NTLM (по умолчанию). |
См. также
Основные понятия
Шифрование и целостность сообщений
Проверка подлинности для канала HTTP
Проверка подлинности для канала IPC