방법: 지원하는 자격 증명 만들기
둘 이상의 자격 증명이 필요한 사용자 지정 보안 체계를 사용할 수 있습니다. 예를 들어 서비스는 클라이언트로부터 사용자 이름과 암호뿐 아니라 클라이언트가 18세 이상임을 입증하는 자격 증명을 요구할 수 있습니다. 두 번째 자격 증명은 지원 자격 증명입니다. 이 항목에서는 WCF(Windows Communication Foundation) 클라이언트에 이러한 자격 증명을 구현하는 방법에 대해 설명합니다.
참고 항목
지원 자격 증명의 사양은 WS-SecurityPolicy 사양의 일부입니다. 자세한 내용은 웹 서비스 보안 사양을 참조하세요.
Supporting Tokens
간단히 설명해서, 메시지 보안을 사용하는 경우 메시지 보안을 유지하는 데 항상 ‘기본 자격 증명’이 사용됩니다(예: X.509 인증서 또는 Kerberos 티켓).
사양에 정의된 대로 보안 바인딩은 ‘토큰’을 사용하여 메시지 교환의 보안을 유지합니다. ‘토큰’은 보안 자격 증명의 표현입니다.
보안 바인딩은 보안 바인딩 정책에 식별된 기본 토큰을 사용하여 서명을 만듭니다. 이 서명을 ‘메시지 서명’이라고 합니다.
추가 토큰을 지정하여 메시지 서명과 연결된 토큰이 제공하는 클레임을 증대시킬 수 있습니다.
보증, 서명 및 암호화
지원 자격 증명을 사용하면 메시지 내부에 ‘지원 토큰’이 전송됩니다. WS-SecurityPolicy 사양은 다음 표에 설명된 것처럼 지원 토큰을 메시지에 첨부하는 네 가지 방법을 정의합니다.
목적 | 설명 |
---|---|
Signed | 지원 토큰은 보안 헤더에 포함되고 메시지 서명으로 서명됩니다. |
보증 | ‘보증 토큰’은 메시지 서명에 서명합니다. |
서명 및 보증 | 서명된 보증 토큰은 메시지 서명에서 생성된 ds:Signature 요소에 서명하고 그 자체가 해당 메시지 서명으로 서명됩니다. 즉, 두 토큰(메시지 서명에 사용된 토큰과 서명된 보증 토큰)이 서로에 서명합니다. |
서명 및 암호화 | 서명 및 암호화된 지원 토큰은 wsse:SecurityHeader 에 나타날 때 암호화되는 서명된 지원 토큰입니다. |
지원 자격 증명 프로그래밍
지원 토큰을 사용하는 서비스를 만들려면 <customBinding>을 만들어야 합니다. (자세한 내용은 방법: SecurityBindingElement를 사용하여 사용자 지정 바인딩 만들기를 참조하세요.)
사용자 지정 바인딩을 만들 때의 첫 단계는 다음 세 가지 형식 중 하나일 수 있는 보안 바인딩 요소를 만드는 작업입니다.
모든 클래스는 다음 네 가지 관련 속성을 포함하는 SecurityBindingElement에서 상속됩니다.
범위
지원 자격 증명에 대한 두 가지 범위가 있습니다.
‘엔드포인트 지원 토큰’은 엔드포인트의 모든 작업을 지원합니다. 즉, 엔드포인트 작업을 호출할 때마다 지원 토큰이 나타내는 자격 증명을 사용할 수 있습니다.
‘작업 지원 토큰’은 특정 엔드포인트 작업만 지원합니다.
속성 이름이 나타내는 것처럼 지원 자격 증명은 필수 또는 옵션일 수 있습니다. 즉, 지원 자격 증명이 있으면 필요하지 않아도 사용되지만 없어도 인증이 실패하지 않습니다.
절차
지원 자격 증명을 포함하는 사용자 지정 바인딩을 만들려면
보안 바인딩 요소를 만듭니다. 아래 예제에서는 SymmetricSecurityBindingElement 인증 모드로
UserNameForCertificate
를 만듭니다. CreateUserNameForCertificateBindingElement 메서드를 사용합니다.해당 속성(
Endorsing
,Signed
,SignedEncrypted
또는SignedEndorsed
)에 의해 반환된 형식 컬렉션에 지원 매개 변수를 추가합니다. System.ServiceModel.Security.Tokens 네임스페이스의 형식에는 X509SecurityTokenParameters 같은 자주 사용되는 형식이 포함됩니다.
예제
설명
다음 예제에서는 SymmetricSecurityBindingElement의 인스턴스를 만들고 KerberosSecurityTokenParameters 클래스의 인스턴스를 반환된 Endorsing 속성 컬렉션에 추가합니다.
코드
public static Binding CreateMultiFactorAuthenticationBinding()
{
HttpTransportBindingElement httpTransport = new HttpTransportBindingElement();
// The message security binding element will be configured to require 2 tokens:
// 1) A user name/password encrypted with the service token.
// 2) A client certificate used to sign the message.
// Instantiate a binding element that will require the user name/password token
// in the message (encrypted with the server certificate).
SymmetricSecurityBindingElement messageSecurity = SecurityBindingElement.CreateUserNameForCertificateBindingElement();
// Create supporting token parameters for the client X.509 certificate.
X509SecurityTokenParameters clientX509SupportingTokenParameters = new X509SecurityTokenParameters();
// Specify that the supporting token is passed in the message send by the client to the service.
clientX509SupportingTokenParameters.InclusionMode = SecurityTokenInclusionMode.AlwaysToRecipient;
// Turn off derived keys.
clientX509SupportingTokenParameters.RequireDerivedKeys = false;
// Augment the binding element to require the client's X.509 certificate as an
// endorsing token in the message.
messageSecurity.EndpointSupportingTokenParameters.Endorsing.Add(clientX509SupportingTokenParameters);
// Create a CustomBinding based on the constructed security binding element.
return new CustomBinding(messageSecurity, httpTransport);
}