AD FS를 사용하는 ID 위임 시나리오

[.NET Framework 4.5부터 WIF(Windows Identity Foundation)가 .NET Framework에 완전히 통합되었습니다. 이 항목에서 다루는 WIF 버전인 WIF 3.5는 더 이상 사용되지 않으며 .NET Framework 3.5 SP1 또는 .NET Framework 4에 대해 개발할 때만 사용해야 합니다. WIF 4.5라고도 하는 .NET Framework 4.5의 WIF에 대한 자세한 내용은 .NET Framework 4.5 개발 가이드의 Windows Identity Foundation 설명서를 참조하세요.]

이 시나리오에서는 액세스 제어 검사 수행하기 위해 ID 위임 체인이 필요한 백 엔드 리소스에 액세스해야 하는 애플리케이션에 대해 설명합니다. 간단한 ID 위임 체인은 일반적으로 초기 호출자에 대한 정보와 직접 호출자의 ID로 구성됩니다.

현재 Windows 플랫폼의 Kerberos 위임 모델을 사용하면 백 엔드 리소스는 초기 호출자의 ID가 아닌 직접 호출자의 ID에만 액세스할 수 있습니다. 이 모델을 일반적으로 신뢰할 수 있는 하위 시스템 모델이라고 합니다. WIF는 기본 행위자 속성을 사용하여 위임 체인의 즉시 호출자뿐만 아니라 초기 호출자의 ID를 확인합니다.

다음 다이어그램에서는 Fabrikam 직원이 Contoso.com 애플리케이션에 노출된 리소스에 액세스하는 일반적인 ID 위임 시나리오를 보여 줍니다.

Identity

이 시나리오에 참여하는 가상 사용자는 다음과 같습니다.

  • Frank: Contoso 리소스에 액세스하려는 Fabrikam 직원입니다.
  • Daniel: 애플리케이션에서 필요한 변경 내용을 구현하는 Contoso 애플리케이션 개발자입니다.
  • Adam: Contoso IT 관리자입니다.

이 시나리오와 관련된 구성 요소는 다음과 같습니다.

  • web1: 초기 호출자의 위임된 ID가 필요한 백 엔드 리소스에 대한 링크가 있는 웹 애플리케이션입니다. 이 애플리케이션은 ASP.NET 사용하여 빌드됩니다.
  • SQL Server에 액세스하는 웹 서비스로, 즉시 호출자의 ID와 함께 초기 호출자의 위임된 ID가 필요합니다. 이 서비스는 WCF를 사용하여 빌드됩니다.
  • sts1: 클레임 공급자의 역할에 있고 애플리케이션(web1)에서 예상하는 클레임을 내보내는 STS입니다. Fabrikam.com 및 애플리케이션과의 신뢰를 구축했습니다.
  • sts2: Fabrikam.com ID 공급자의 역할이며 Fabrikam 직원이 인증하는 데 사용하는 엔드포인트를 제공하는 STS입니다. Fabrikam 직원이 Contoso.com 리소스에 액세스할 수 있도록 Contoso.com 대한 신뢰를 구축했습니다.

참고 항목

이 시나리오에서 자주 사용되는 "ActAs 토큰"이라는 용어는 STS에서 발급되고 사용자의 ID를 포함하는 토큰을 나타냅니다. Actor 속성에는 STS의 ID가 포함됩니다.

이전 다이어그램에 표시된 것처럼 이 시나리오의 흐름은 다음과 같습니다.

  1. Contoso 애플리케이션은 Fabrikam 직원의 ID와 행위자 속성의 즉시 호출자 ID를 모두 포함하는 ActAs 토큰을 가져오도록 구성됩니다. Daniel은 이러한 변경 내용을 애플리케이션에 구현했습니다.
  2. Contoso 애플리케이션은 ActAs 토큰을 백 엔드 서비스에 전달하도록 구성됩니다. Daniel은 이러한 변경 내용을 애플리케이션에 구현했습니다.
  3. Contoso 웹 서비스는 sts1을 호출하여 ActAs 토큰의 유효성을 검사하도록 구성됩니다. Adam은 sts1에서 위임 요청을 처리할 수 있도록 했습니다.
  4. Fabrikam 사용자 Frank는 Contoso 애플리케이션에 액세스하고 백 엔드 리소스에 대한 액세스 권한을 부여합니다.

ID 공급자 설정(IP)

Fabrikam.com 관리자 Frank에 사용할 수 있는 세 가지 옵션이 있습니다.

  1. AD FS(Active Directory® Federation Services)와 같은 STS 제품을 구매하고 설치합니다.
  2. LiveID STS와 같은 클라우드 STS 제품을 구독합니다.
  3. WIF를 사용하여 사용자 지정 STS를 빌드합니다.

이 샘플 시나리오에서는 Frank가 option1을 선택하고 AD FS를 IP-STS로 설치한다고 가정합니다. 또한 사용자를 인증하도록 \windowsauth라는 엔드포인트를 구성합니다. Frank는 AD FS 제품 설명서를 참조하고 Contoso IT 관리자인 Adam과 통신하여 Contoso.com 신뢰합니다기본.

클레임 공급자 설정

Contoso.com 관리자 Adam에서 사용할 수 있는 옵션은 ID 공급자에 대해 이전에 설명한 것과 동일합니다. 이 샘플 시나리오에서는 Adam이 옵션 1을 선택하고 AD FS 2.0을 RP-STS로 설치한다고 가정합니다.

IP 및 애플리케이션을 사용하여 신뢰 설정

Adam은 AD FS 설명서를 참조하여 Fabrikam.com 애플리케이션 간에 트러스트를 설정합니다.

위임 설정

AD FS는 위임 처리를 제공합니다. Adam은 AD FS 설명서를 참조하여 ActAs 토큰을 처리할 수 있도록 합니다.

애플리케이션별 변경 내용

기존 애플리케이션에 ID 위임에 대한 지원을 추가하려면 다음을 변경해야 합니다. Daniel은 WIF를 사용하여 이러한 변경을 합니다.

  • web1이 sts1에서 받은 부트스트랩 토큰을 캐시합니다.
  • 발급된 토큰과 함께 CreateChannelActingAs를 사용하여 백 엔드 웹 서비스에 대한 채널을 만듭니다.
  • 백 엔드 서비스의 메서드를 호출합니다.

부트스트랩 토큰 캐시

부트스트랩 토큰은 STS에서 발급한 초기 토큰이며 애플리케이션은 해당 토큰에서 클레임을 추출합니다. 이 샘플 시나리오에서 이 토큰은 사용자 Frank에 대해 sts1에서 발급되고 애플리케이션은 이를 캐시합니다. 다음 코드 샘플은 ASP.NET 애플리케이션에서 부트스트랩 토큰을 검색하는 방법을 보여줍니다.

// Get the Bootstrap Token
SecurityToken bootstrapToken = null;

IClaimsPrincipal claimsPrincipal = Thread.CurrentPrincipal as IClaimsPrincipal;
if ( claimsPrincipal != null )
{
    IClaimsIdentity claimsIdentity = (IClaimsIdentity)claimsPrincipal.Identity;
    bootstrapToken = claimsIdentity.BootstrapToken;
}

WIF는 지정된 보안 토큰을 ActAs 요소로 사용하여 토큰 발급 요청을 보강하는 지정된 형식의 채널을 만드는 CreateChannelActingAs 메서드를 제공합니다. 부트스트랩 토큰을 이 메서드에 전달한 다음 반환된 채널에서 필요한 서비스 메서드를 호출할 수 있습니다. 이 샘플 시나리오에서 Frank의 ID에는 행위자 속성이 web1의 ID로 설정됩니다.

다음 코드 조각은 CreateChannelActingAs를 사용하여 웹 서비스를 호출한 다음, 반환된 채널에서 서비스의 메서드 중 하나인 ComputeResponse를 호출하는 방법을 보여 줍니다.

// Get the channel factory to the backend service from the application state
ChannelFactory<IService2Channel> factory = (ChannelFactory<IService2Channel>)Application[Global.CachedChannelFactory];

// Create and setup channel to talk to the backend service
IService2Channel channel;
lock (factory)
{
// Setup the ActAs to point to the caller's token so that we perform a
// delegated call to the backend service
// on behalf of the original caller.
    channel = factory.CreateChannelActingAs<IService2Channel>(callerToken);
}

string retval = null;

// Call the backend service and handle the possible exceptions
try
{
    retval = channel.ComputeResponse(value);
    channel.Close();
} catch (Exception exception)
{
    StringBuilder sb = new StringBuilder();
    sb.AppendLine("An unexpected exception occurred.");
    sb.AppendLine(exception.StackTrace);
    channel.Abort();
    retval = sb.ToString();
}

웹 서비스별 변경 내용

웹 서비스는 WCF를 사용하여 빌드되고 WIF에 대해 사용하도록 설정되므로 바인딩이 적절한 발급자 주소로 IssuedSecurityTokenParameters로 구성되면 ACTA의 유효성 검사가 WIF에 의해 자동으로 처리됩니다.

웹 서비스는 애플리케이션에 필요한 특정 메서드를 노출합니다. 서비스에는 특정 코드 변경이 필요하지 않습니다. 다음 코드 샘플에서는 IssuedSecurityTokenParameters를 사용하여 웹 서비스의 구성을 보여 줍니다.

// Configure the issued token parameters with the correct settings
IssuedSecurityTokenParameters itp = new IssuedSecurityTokenParameters( "http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1" );
itp.IssuerMetadataAddress = new EndpointAddress( "http://localhost:6000/STS/mex" );
itp.IssuerAddress = new EndpointAddress( "http://localhost:6000/STS" );

// Create the security binding element
SecurityBindingElement sbe = SecurityBindingElement.CreateIssuedTokenForCertificateBindingElement( itp );
sbe.MessageSecurityVersion = MessageSecurityVersion.WSSecurity11WSTrust13WSSecureConversation13WSSecurityPolicy12BasicSecurityProfile10;

// Create the HTTP transport binding element
HttpTransportBindingElement httpBE = new HttpTransportBindingElement();

// Create the custom binding using the prepared binding elements
CustomBinding binding = new CustomBinding( sbe, httpBE );

using ( ServiceHost host = new ServiceHost( typeof( Service2 ), new Uri( "http://localhost:6002/Service2" ) ) )
{
    host.AddServiceEndpoint( typeof( IService2 ), binding, "" );
    host.Credentials.ServiceCertificate.SetCertificate( "CN=localhost", StoreLocation.LocalMachine, StoreName.My );

// Enable metadata generation via HTTP GET
    ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
    smb.HttpGetEnabled = true;
    host.Description.Behaviors.Add( smb );
    host.AddServiceEndpoint( typeof( IMetadataExchange ), MetadataExchangeBindings.CreateMexHttpBinding(), "mex" );

// Configure the service host to use WIF
    ServiceConfiguration configuration = new ServiceConfiguration();
    configuration.IssuerNameRegistry = new TrustedIssuerNameRegistry();

    FederatedServiceCredentials.ConfigureServiceHost( host, configuration );

    host.Open();

    Console.WriteLine( "Service2 started, press ENTER to stop ..." );
    Console.ReadLine();

    host.Close();
}

다음 단계

AD FS 개발