2017-04-12 11 views
1

데이터 보호 API를 이해하는 데 어려움이 있습니다.클러스터 된 환경의 ASP.Net 핵심 데이터 보호 API

클러스터 된 환경 (서비스 패브릭)에서 일부 핵심 코어 웹 응용 프로그램을 설정하려고합니다. 이전에는 각 컴퓨터가 web.config에서 동일한 키를 사용하는지 확인했습니다. 단순한. 새로운 데이터 보호 API를 사용하면 약간 (로터스!) 비트가 더 복잡해 보입니다.

설명서 here에서 알맞은 인증서로 데이터 보호 서비스를 설정하는 것처럼 간단해야합니다.

그러나 나는이 시도 :

public static void Main(string[] args) 
    { 
     // add data protection services 
     var serviceCollection = new ServiceCollection(); 
     string thumbPrint = "XXXXXXXXXXXX"; 
     serviceCollection.AddDataProtection() 
      .ProtectKeysWithDpapiNG($"CERTIFICATE=HashId:{thumbPrint}", flags: Microsoft.AspNetCore.DataProtection.XmlEncryption.DpapiNGProtectionDescriptorFlags.None); 
     var services = serviceCollection.BuildServiceProvider(); 

     // create an instance of MyClass using the service provider 
     var instance = ActivatorUtilities.CreateInstance<MyClass>(services); 
     instance.RunSample(); 
    } 

    public class MyClass 
    { 
     IDataProtector _protector; 

     // the 'provider' parameter is provided by DI 
     public MyClass(IDataProtectionProvider provider) 
     { 
      _protector = provider.CreateProtector("Contoso.MyClass.v1"); 
     } 

     public void RunSample() 
     { 
      Console.Write("Enter input: "); 
      string input = Console.ReadLine(); 

      // protect the payload 
      string protectedPayload = _protector.Protect(input); 
      Console.WriteLine($"Protect returned: {protectedPayload}"); 

      // unprotect the payload 
      string unprotectedPayload = _protector.Unprotect(protectedPayload); 
      Console.WriteLine($"Unprotect returned: {unprotectedPayload}"); 

      Console.ReadLine(); 
     } 
    } 

을 그리고 난 그냥

System.InvalidOperationException occurred 
    HResult=0x80131509 
    Message=No service for type 'Microsoft.AspNetCore.DataProtection.Repositories.IXmlRepository' has been registered. 

의 예외가 이후 일부 키에 지정된 지속 된 가게가 없기 때문에이 있다고 밝혀 주위를 파고.

여기에 어떤 조언이 있습니까? 키를 일부 중앙 위치 (예 : 모든 응용 프로그램에서 사용할 수있는 공유)로 유지해야합니까? 그렇다면 이유는 무엇입니까?

+0

키가 유지되는 위치를 명시해야합니다. https://docs.microsoft.com/en-gb/aspnet/core/security/data-protection/configuration/overview -'.PersistKeysToFileSystem (새로운 DirectoryInfo (@ "\\ server \ share \ directory \")); 예를 들어. – Christo

+0

@Christo 감사합니다! 완전히이 질문을 업데이트 한 것으로 생각하여 AzureStorage에 대한 키 유지가 끝났습니다. – Mardoxx

답변

0

IXmlRepository 구현을 제공해야 데이터 보호 API에 키를 저장할 위치가 제공됩니다. ProtectKeysWith*() 지시어는 나머지 키를 보호합니다 (기본적으로 키를 저장하기 전에 암호화합니다!). 추가 정보 here.

저는 AzureStorage에 키를 계속 저장했습니다. 더 많은 정보 here.

serviceCollection.AddDataProtection() 
    .ProtectKeysWithDpapiNG($"CERTIFICATE=HashId:{thumbPrint}", flags: Microsoft.AspNetCore.DataProtection.XmlEncryption.DpapiNGProtectionDescriptorFlags.None) 
    .PersistKeysToAzureBlobStorage(/* params */); 

또한 인증서가 인증서 저장소에 저장해야 키와 응용 프로그램에서 읽기 권한이 있어야합니다 액세스를 실행하는 계정을 보호하는 데 사용 주목할 가치가있다. here을 참조하십시오.