2017-04-12 3 views
1

J'ai des difficultés à comprendre l'API de protection des données. Je veux mettre en place quelques applications Web de noyau net dans un environnement en clusters (tissu de service). Auparavant, vérifiez que chaque machine possède la même clé dans son fichier web.config. Simple. Avec la nouvelle API de protection des données, il semble un peu (lottle!) Un peu plus impliqué. De la documentation here, il semble que cela devrait être aussi simple que de configurer le service de protection des données avec le certificat approprié.API de protection des données de base ASP.Net dans un environnement en cluster

Cependant j'ai essayé ceci:

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(); 
     } 
    } 

Je viens d'obtenir une exception de

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

qui, après des fouilles se retourne que c'est parce qu'il n'y a pas de magasin persistant spécifié pour les clés.

Qu'est-ce qui est conseillé ici? Devrais-je conserver mes clés dans un emplacement central (c'est-à-dire un partage disponible pour toutes mes applications)? Si oui, quelle est la raison?

+0

vous devez être explicite quant à l'endroit où les clés sont conservées. https://docs.microsoft.com/en-gb/aspnet/core/security/data-protection/configuration/overview - essayez '.PersistKeysToFileSystem (new DirectoryInfo (@" \\ serveur \ partage \ répertoire \ ")); par exemple. – Christo

+0

@Christo Merci! Totalement pensé que j'ai mis à jour cette question, j'ai fini par persister mes clés à AzureStorage. – Mardoxx

Répondre

0

Vous devez fournir une implémentation de IXmlRepository qui fournit à l'API de protection des données un emplacement pour stocker les clés. Les directives ProtectKeysWith*() protègent les clés au repos (en termes de base, crypte les clés avant de les enregistrer!). Infos supplémentaires here. J'ai fini par conserver mes clés AzureStorage. Plus d'info here.

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

Il est également intéressant de noter que le certificat utilisé pour protéger les clés doivent être stockés dans un magasin de certificats et le compte que l'application est en cours d'exécution en vertu doit avoir un accès en lecture. Voir here.