인증을 위해 서비스 ID 재정의

일반적으로 선택한 클라이언트 자격 증명 형식에 따라 서비스 메타데이터에 노출되는 ID 형식이 결정되므로 서비스에 ID를 설정할 필요가 없습니다. 예를 들어 다음 구성 코드는 <wsHttpBinding> 요소를 사용하고 clientCredentialType 특성을 Windows로 설정합니다.

다음 WSDL(웹 서비스 기술 언어) 단편에서는 이전에 정의한 엔드포인트의 ID를 보여 줍니다. 이 예에서 서비스는 특정 사용자 계정(username@contoso.com)에서 자체 호스팅 서비스로 실행되므로 UPN(사용자 계정 이름) ID에 계정 이름이 포함됩니다. UPN은 Windows 도메인에서 사용자 로그인 이름이라고도 합니다.

ID 설정을 보여 주는 샘플 애플리케이션에 대해서는 서비스 ID 샘플을 참조하세요. 서비스 ID에 대한 자세한 내용은 서비스 ID 및 인증을 참조하세요.

Kerberos 인증 및 ID

기본적으로 서비스가 Windows 자격 증명을 사용하도록 구성된 경우 <userPrincipalName> 또는 <servicePrincipalName> 요소를 포함하는 <identity> 요소는 WSDL에서 생성됩니다. LocalSystem, LocalService 또는 NetworkService 계정으로 서비스를 실행하는 경우 이러한 계정이 컴퓨터의 SPN 데이터에 액세스할 수 있으므로 기본적으로 SPN(서비스 사용자 이름)이 host/<hostname> 형태로 생성됩니다. 서비스가 다른 계정으로 실행 중인 경우 WCF(Windows Communication Foundation)는 <username>@<domainName> 형식으로 UPN을 생성합니다. Kerberos 인증에서 서비스를 인증하려면 UPN 또는 SPN을 클라이언트에 제공해야 하므로 이 작업이 수행됩니다.

Setspn 도구를 사용하여 도메인의 서비스 계정으로 추가 SPN을 등록할 수도 있습니다. 그런 다음 SPN을 서비스 ID로 사용할 수 있습니다. 도구에 대한 자세한 내용은 Setspn 개요를 참조하세요.

참고 항목

Windows 자격 증명 형식을 협상 없이 사용하려면 서비스의 사용자 계정이 Active Directory 도메인에 등록된 SPN에 대한 액세스 권한이 있어야 합니다. 다음 방법으로 이 작업을 수행할 수 있습니다.

  • NetworkService 또는 LocalSystem 계정을 사용하여 서비스를 실행합니다. 이러한 계정은 시스템에서 Active Directory 도메인에 연결할 때 설정된 시스템 SPN에 대한 액세스 권한이 있으므로, WCF에서는 서비스 메타데이터(WSDL)의 서비스 엔드포인트에 적절한 SPN 요소를 자동으로 생성합니다.

  • 임의의 Active Directory 도메인 계정을 사용하여 서비스를 실행합니다. 이 경우 해당 도메인 계정의 SPN을 설정합니다. Setspn.exe 유틸리티 도구를 사용하여 이 작업을 수행할 수 있습니다. 서비스 계정의 SPN을 만들고 나면 메타데이터(WSDL)를 통해 서비스 클라이언트에 SPN을 게시하도록 WCF를 구성합니다. 이 작업은 애플리케이션 구성 파일이나 코드를 통해 노출된 엔드포인트에 대한 엔드포인트 ID를 설정하여 수행합니다.

SPN, Kerberos 프로토콜 및 Active Directory에 대한 자세한 내용은 Windows용 Kerberos 기술 보충 자료를 참조하세요.

SPN 또는 UPN이 빈 문자열인 경우

SPN 또는 UPN을 빈 문자열과 같게 설정하면 사용되는 보안 수준과 인증 모드에 따라 다른 많은 작업이 수행됩니다.

  • 전송 수준 보안을 사용하는 경우 NTLM(NT LanMan) 인증이 선택됩니다.

  • 메시지 수준 보안을 사용하는 경우 인증 모드에 따라 인증이 실패할 수 있습니다.

  • spnego 모드를 사용하고 AllowNtlm 특성이 false로 설정된 경우 인증이 실패합니다.

  • spnego 모드를 사용하고 AllowNtlm 특성이 true로 설정된 경우 UPN이 비어 있으면 인증이 실패하지만 SPN이 비어 있으면 성공합니다.

  • "단일 쇼트"라고도 하는 Kerberos direct를 사용하는 경우 인증이 실패합니다.

구성에서 <identity> 요소 사용

이전에 Certificate에 표시된 바인딩에서 클라이언트 자격 증명 형식을 변경하면 생성된 WSDL에 다음 코드에 표시된 ID 값에 대한 Base64로 serialize된 X.509 인증서가 포함됩니다. 이는 Windows 이외의 모든 클라이언트 자격 증명 형식에 대한 기본값입니다.

구성에 <identity> 요소를 사용하거나 코드에서 ID를 설정하여 기본 서비스 ID의 값을 변경하거나 ID 형식을 변경할 수 있습니다. 다음 구성 코드에서는 값 contoso.com으로 DNS(Domain Name System) ID를 설정합니다.

프로그래밍 방식으로 ID 설정

WCF에서 자동으로 ID를 결정하므로 서비스에서 ID를 명시적으로 지정할 필요가 없습니다. 그러나 WCF를 사용하면 필요한 경우 엔드포인트에서 ID를 지정할 수 있습니다. 다음 코드에서는 특정 DNS ID를 사용하여 새 서비스 엔드포인트를 추가합니다.

ServiceEndpoint ep = myServiceHost.AddServiceEndpoint(
                typeof(ICalculator),
                new WSHttpBinding(),
                String.Empty);
EndpointAddress myEndpointAdd = new EndpointAddress(new Uri("http://localhost:8088/calc"),
     EndpointIdentity.CreateDnsIdentity("contoso.com"));
ep.Address = myEndpointAdd;
Dim ep As ServiceEndpoint = myServiceHost.AddServiceEndpoint(GetType(ICalculator), New WSHttpBinding(), String.Empty)
Dim myEndpointAdd As New EndpointAddress(New Uri("http://localhost:8088/calc"), EndpointIdentity.CreateDnsIdentity("contoso.com"))
ep.Address = myEndpointAdd

참고 항목