ASP.NET Core의 용도 계층 구조 및 다중 테넌트

IDataProtector는 암시적으로 IDataProtectionProvider이므로 용도를 함께 연결할 수 있습니다. 이 의미에서 provider.CreateProtector([ "purpose1", "purpose2" ])provider.CreateProtector("purpose1").CreateProtector("purpose2")와 같습니다.

이는 데이터 보호 시스템을 통해 일부 흥미로운 계층 관계를 가능하게 합니다. Contoso.Messaging.SecureMessage의 이전 예제에서 SecureMessage 구성 요소는 먼저 provider.CreateProtector("Contoso.Messaging.SecureMessage")를 호출하고 결과를 개인 _myProvider 필드에 캐시할 수 있습니다. 그런 다음, _myProvider.CreateProtector("User: username")에 대한 호출을 통해 향후 보호기를 만들 수 있으며, 이러한 보호기는 개별 메시지를 보호하는 데 사용됩니다.

이를 대칭 이동할 수도 있습니다. 여러 테넌트를 호스팅하는 단일 논리적 애플리케이션(CMS가 적절)을 고려하고, 각 테넌트는 자체 인증 및 상태 관리 시스템을 사용하여 구성할 수 있습니다. 포괄적인 애플리케이션에는 단일 마스터 공급자가 있으며 provider.CreateProtector("Tenant 1")provider.CreateProtector("Tenant 2")를 호출하여 각 테넌트에 데이터 보호 시스템의 고유한 격리 조각을 제공합니다. 그런 다음, 테넌트는 자체 요구 사항에 따라 자체 개별 보호기를 파생시킬 수 있지만, 시스템의 다른 테넌트와 충돌하는 보호기를 만들 수는 없습니다. 그래픽적으로 아래와 같이 표현됩니다.

Multi tenancy purposes

Warning

이는 포괄적인 애플리케이션이 개별 테넌트에 사용할 수 있는 API를 제어하고 테넌트가 서버에서 임의 코드를 실행할 수 없다고 가정합니다. 테넌트가 임의의 코드를 실행할 수 있는 경우 개인 리플렉션을 수행하여 격리 보장을 중단하거나 마스터 키 자료를 직접 읽고 원하는 하위 키를 파생할 수 있습니다.

데이터 보호 시스템은 실제로 기본 구성으로 일종의 다중 테넌트를 사용합니다. 기본적으로 마스터 키 자료는 작업자 프로세스 계정의 사용자 프로필 폴더(또는 IIS 애플리케이션 풀 ID에 대한 레지스트리)에 저장됩니다. 그러나 실제로는 단일 계정을 사용하여 여러 애플리케이션을 실행하는 것이 매우 일반적입니다. 따라서 이러한 모든 애플리케이션은 마스터 키 자료를 공유하게 됩니다. 이를 해결하기 위해 데이터 보호 시스템은 전체 용도 체인에서 첫 번째 요소로 고유한 애플리케이션별 식별자를 자동으로 삽입합니다. 이 암시적 용도는 각 애플리케이션을 시스템 내의 고유한 테넌트로 효율적으로 처리하여 개별 애플리케이션을 서로 격리하는 데 사용되며, 보호기 생성 프로세스는 위의 이미지와 동일합니다.