TCP 채널 인증
이 항목은 이전 버전의 기존 응용 프로그램과의 호환성을 위해 유지되고 있으나 새로운 개발에는 권장되지 않는 레거시 기술에 대해 설명합니다. 분산 응용 프로그램은 이제 WCF(Windows Communication Foundation)를 사용하여 개발됩니다.
TCP 채널은 인증 및 가장을 직접 지원합니다. 이 항목에서는 클라이언트 및 서버 채널을 구성하는 방법에 대해 설명합니다.
.NET Framework를 사용하면 원격 개체의 서버가 연결된 TcpServerChannel 및 TcpClientChannel 개체의 속성을 설정하여 호출자를 인증하고 가장할 수 있습니다.
서버 구성
원격 호출자를 인증하도록 TCP 서버 채널을 구성하려면 다음 구성 파일과 같이 TCP 채널의 secure 속성을 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 속성에 액세스하여 인증된 클라이언트의 ID에 액세스할 수 있습니다. 가장된 클라이언트의 ID는 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. ID로 클라이언트를 인증할 수 있도록 합니다.
다음 구성 파일과 같이 서버의 구성 파일에서 authorizationModule 속성을 "namespace.class, assembly" 형식의 문자열로 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 클라이언트 채널을 구성하려면 다음 구성 파일과 같이 TCP 채널의 secure 속성을 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 클라이언트 채널은 클라이언트 프로세스 실행하는 사용자 ID로 자신을 인증합니다. 다음 코드 샘플과 같이 domain, username 및 password 속성을 설정하여 대체 ID를 지정하면 대체 ID를 지정할 수 있습니다.
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(기본값)을 사용하십시오. |