인증을 위해 서비스 ID 재정의
일반적으로 선택한 클라이언트 자격 증명 형식에 따라 서비스 메타데이터에 노출되는 ID 형식이 결정되므로 서비스에 ID를 설정할 필요가 없습니다. 예를 들어 다음 구성 코드에서는 <wsHttpBinding> 요소를 사용하고 clientCredentialType 특성을 Windows로 설정합니다.
<configuration>
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_Windows">
<security mode="Message">
<message clientCredentialType="Windows"
establishSecurityContext="false"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
<!-- other configuration code not shown -->
</system.serviceModel>
</configuration>
다음 WSDL(웹 서비스 기술 언어) 단편에서는 이전에 정의한 끝점의 ID를 보여 줍니다. 이 예제에서 서비스는 특정 사용자 계정(username@contoso.com)에서 자체 호스팅된 서비스로 실행되므로 UPN(User Principal Name) ID에 계정 이름이 포함됩니다. UPN을 Windows 도메인의 사용자 로그온 이름이라고도 합니다.
<wsdl:service name="CalculatorService">
<wsdl:port name="WSHttpBinding_ICalculator_Windows"
binding="tns:WSHttpBinding_ICalculator_Windows">
<soap12:address
location=
"https://localhost:8003/servicemodelsamples/service/upnidentity" />
<wsa10:EndpointReference>
<wsa10:Address>
https://localhost:8003/servicemodelsamples/service/upnidentity
</wsa10:Address>
<Identity
xmlns="https://schemas.xmlsoap.org/ws/2006/02/addressingidentity">
<Upn>username@contoso.com</Upn>
</Identity>
</wsa10:EndpointReference>
</wsdl:port>
</wsdl:service>
ID 설정을 보여 주는 샘플 응용 프로그램에 대해서는 Service Identity 샘플을 참조하십시오. 서비스 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.exe 도구를 사용하여 도메인의 서비스 계정으로 추가 SPN을 등록할 수도 있습니다. 그런 다음 SPN을 서비스 ID로 사용할 수 있습니다. 도구를 다운로드하려면 Windows 2000 Resource Kit Tool: Setspn.exe를 참조하십시오. 도구에 대한 자세한 내용은 Setspn Overview를 참조하십시오.
참고: |
---|
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에 대한 자세한 내용은 Kerberos Technical Supplement for Windows를 참조하십시오.
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 xmlns="https://schemas.xmlsoap.org/ws/2006/02/addressingidentity">
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<X509Data>
<X509Certificate>MIIBxjCCAXSgAwIBAgIQmXJgyu9tro1M98GifjtuoDAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTA2MDUxNzIxNDQyNVoXDTM5MTIzMTIzNTk1OVowKTEQMA4GA1UEChMHQ29udG9zbzEVMBMGA1UEAxMMaWRlbnRpdHkuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDBmivcb8hYbh11hqVoDuB7zmJ2y230f/b4e+4P6yXtKKuhUdYcIqc8mAforIM4WWJEVGeJVq9sFEwqrL5Ryid8jMTRwPLvA/x/wvj1gtD1GWJ+aUh2pqieiGL7MWTepHAQBIibUxgOrAOz0j9Xhg0iDFYScdYUjeqI3yZIDC7WbwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBADB/J2QjdSPL8Doj3pAveCXd/5fY03eo9kUym/Tmb4ubdqsObri0qnYR/n8Wxsa1yJ4Dks6cNBTPS4l5B7zUeNo=</X509Certificate>
</X509Data>
</KeyInfo>
</Identity>
구성에 <identity> 요소를 사용하거나 코드에서 ID를 설정하여 기본 서비스 ID의 값을 변경하거나 ID 형식을 변경할 수 있습니다. 다음 구성 코드에서는 값 contoso.com
으로 DNS(Domain Name System) ID를 설정합니다.
프로그래밍 방식으로 ID 설정
WCF에서 자동으로 확인하므로 서비스가 명시적으로 ID를 지정할 필요는 없습니다. 그러나 필요한 경우 WCF에서 끝점에 ID를 지정할 수 있습니다. 다음 코드에서는 특정 DNS ID를 사용하여 새 서비스 끝점을 추가합니다.
Dim ep As ServiceEndpoint = myServiceHost.AddServiceEndpoint(GetType(ICalculator), New WSHttpBinding(), String.Empty)
Dim myEndpointAdd As New EndpointAddress(New Uri("https://localhost:8088/calc"), EndpointIdentity.CreateDnsIdentity("contoso.com"))
ep.Address = myEndpointAdd
ServiceEndpoint ep = myServiceHost.AddServiceEndpoint(
typeof(ICalculator),
new WSHttpBinding(),
String.Empty);
EndpointAddress myEndpointAdd = new EndpointAddress(new Uri("https://localhost:8088/calc"),
EndpointIdentity.CreateDnsIdentity("contoso.com"));
ep.Address = myEndpointAdd;