부분 신뢰 모범 사례
이 문서에서는 부분 신뢰 환경에서 WCF(Windows Communication Foundation)를 실행할 때의 모범 사례를 설명합니다.
Serialization
부분 신뢰 애플리케이션에서 DataContractSerializer를 사용할 때 다음 방법을 적용합니다.
serialize할 수 있는 모든 형식은 명시적으로 [DataContract]
특성으로 표시해야 합니다. 다음 기술은 부분 신뢰 환경에서 지원되지 않습니다.
- serialize할 클래스를 SerializableAttribute로 표시하는 기술
- 클래스가 serialization 프로세스를 제어할 수 있도록 ISerializable 인터페이스를 구현하는 기술
DataContractSerializer 사용
[DataContract]
특성으로 표시된 형식은 모두 public이어야 합니다. 퍼블릭이 아닌 형식은 부분 신뢰 환경에서 직렬화할 수 없습니다.serialize할 수 있는
[DataContract]
형식의 모든[DataContract]
멤버는 public이어야 합니다. 퍼블릭이 아닌[DataMember]
가 있는 형식은 부분 신뢰 환경에서 직렬화할 수 없습니다.OnSerializing
,OnSerialized
,OnDeserializing
및OnDeserialized
와 같은 serialization 이벤트를 처리하는 메서드는 public으로 선언해야 합니다. 그러나 OnDeserialization(Object)의 명시적 구현과 암시적 구현이 모두 지원됩니다.DataContractSerializer가 deserialization을 수행하는 동안 새로 인스턴스화된 개체의 생성자를 호출하지 않으므로 AllowPartiallyTrustedCallersAttribute로 표시된 어셈블리에서 구현한
[DataContract]
형식은 형식 생성자에서 보안 관련 작업을 수행해서는 안 됩니다. 특히 다음과 같은 일반적인 보안 기술은[DataContract]
형식에 사용해서는 안 됩니다.형식 생성자를 internal 또는 private으로 설정하여 부분 신뢰 액세스를 제한하려고 시도하는 보안 기술
[LinkDemand]
를 형식 생성자에 추가하여 형식에 대한 액세스를 제한하는 보안 기술개체가 인스턴스화되었기 때문에 생성자가 적용한 유효성 검사가 확인되었다고 가정하는 보안 기술
IXmlSerializable 사용
다음 최선의 방법은 IXmlSerializable을 구현하고 DataContractSerializer를 사용하여 serialize되는 형식에 적용됩니다.
GetSchema 정적 메서드 구현에서는
public
여야 합니다.IXmlSerializable 인터페이스를 구현하는 인스턴스 메서드는
public
여야 합니다.
부분적으로 신뢰하는 호출자의 호출을 허용하는 완전히 신뢰할 수 있는 플랫폼 코드에서 WCF 사용
WCF 부분 신뢰 보안 모델은 WCF 퍼블릭 메서드 또는 속성의 호출자가 호스팅 애플리케이션의 CAS(코드 액세스 보안) 컨텍스트에서 실행 중인 것으로 간주합니다. WCF는 또한 각 AppDomain에 하나의 애플리케이션 보안 컨텍스트만 존재하며 이 컨텍스트가 신뢰할 수 있는 호스트(예: CreateDomain에 대한 호출자 또는 ASP.NET 애플리케이션 관리자에 의해)에 의해 AppDomain 생성 시간에 설정되었다고 간주합니다.
참고
CAS(코드 액세스 보안)는 .NET Framework 및 .NET의 모든 버전에서 더 이상 사용되지 않습니다. 최신 버전의 .NET은 CAS 주석을 준수하지 않으며 CAS 관련 API를 사용하는 경우 오류가 발생합니다. 개발자는 보안 작업을 수행하는 대체 수단을 찾아야 합니다.
이 보안 모델은 보통 신뢰 ASP.NET 애플리케이션에서 실행되는 사용자 코드와 같은 추가 CAS 권한을 어설션할 수 없는 사용자가 작성한 애플리케이션에 적용됩니다. 그러나 전역 어셈블리 캐시에 설치되고 부분적으로 신뢰할 수 있는 코드의 호출을 허용하는 타사 어셈블리와 같은 완전히 신뢰할 수 있는 플랫폼 코드에서는 부분적으로 신뢰할 수 있는 애플리케이션 대신 WCF로 호출할 때 애플리케이션 수준의 보안이 취약해지지 않도록 주의해야 합니다.
완전 신뢰 코드는 부분적으로 신뢰할 수 있는 코드 대신 WCF API를 호출하기 전에 Assert, PermitOnly, 또는 Deny를 호출하여 현재 스레드의 CAS 권한 집합을 변경하지 않아야 합니다. 애플리케이션 수준 보안 컨텍스트와 독립적인 스레드 관련 권한 컨텍스트를 어설션하거나 거부하거나 만들면 예기치 않은 동작이 발생할 수 있습니다. 애플리케이션에 따라 이 동작으로 인해 애플리케이션 수준의 보안이 취약해질 수 있습니다.
스레드 관련 권한 컨텍스트를 사용하여 WCF로 호출하는 코드에서는 발생 가능한 다음 상황을 처리할 수 있도록 준비해야 합니다.
작업을 수행하는 동안 스레드 관련 보안 컨텍스트가 유지되지 않을 수 있으며, 이로 인해 잠재적인 보안 예외가 발생할 수 있습니다.
내부 WCF 코드와 사용자가 제공한 콜백은 원래 호출이 시작된 보안 컨텍스트 이외의 다른 보안 컨텍스트에서 실행될 수 있습니다. 이러한 컨텍스트는 다음과 같습니다.
애플리케이션 권한 컨텍스트
현재 실행 중인 AppDomain의 수명 동안 WCF로 호출하는 데 사용되는 다른 사용자 스레드가 이전에 만든 스레드 특정 권한 컨텍스트
WCF 퍼블릭 API 코드로 호출하기 전에 완전 신뢰 권한이 완전히 신뢰할 수 있는 구성 요소에 의해 어설션되지 않은 경우 WCF 는 부분적으로 신뢰할 수 있는 코드가 이러한 권한을 얻을 수 없도록 합니다. 그러나 완전 신뢰 권한의 어설션 결과가 특정 스레드, 작업 또는 사용자 작업에만 적용되는 것은 아닙니다.
가장 좋은 방법은 Assert, PermitOnly 또는 Deny를 호출하여 스레드 관련 권한 컨텍스트를 만들지 않는 것입니다. 대신 애플리케이션 자체에 권한을 부여하거나 거부하면 Assert, Deny 또는 PermitOnly가 필요하지 않습니다.