2017-04-12 17 views
1

データ保護APIを理解できません。クラスタ化された環境でのASP.Netコアデータ保護API

クラスタ環境(サービスファブリック)でいくつかのネットコアWebアプリケーションを設定したいと考えています。以前は、各マシンがweb.configに同じキーを持つようにするだけでした。シンプル。新しいデータ保護APIを使用すると少し(ぬいぐるみ!)ビットがより複雑に見えます。

ドキュメントhereからは、適切な証明書を使用してData Protectionサービスを設定するだけの簡単な手順が必要です。

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- try '.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を参照してください。

関連する問題