3 votes

API de protection des données ASP.Net Core dans un environnement en grappe

J'ai des difficultés à comprendre l'API de protection des données.

Je souhaite mettre en place des applications web net core dans un environnement en cluster (service fabric). Auparavant, il suffit de s'assurer que chaque machine possède la même clé dans son web.config. C'est simple. Avec la nouvelle API de protection des données, cela semble un peu ( lottle !) un peu plus impliquée.

Extrait de la documentation aquí il semble que cela devrait être aussi simple que de configurer le service de protection des données avec le certificat approprié.

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

Et je reçois une exception de

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

Après quelques recherches, il s'avère 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 faire persister mes clés dans un emplacement central (c'est-à-dire un partage qui est disponible pour toutes mes applications). Si oui, pour quelle raison ?

0voto

Mardoxx Points 2246

Vous devez fournir une implémentation de IXmlRepository qui fournit à l'API de protection des données un endroit où stocker les clés. Le site ProtectKeysWith*() protègent les clés au repos (en termes simples, elles chiffrent les clés avant de les sauvegarder !) Informations supplémentaires aquí .

J'ai fini par persister mes clés dans AzureStorage. Plus d'infos aquí .

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

Il convient également de noter que le certificat utilisé pour protéger les clés doit doit être stocké dans un magasin de certificats et le compte sous lequel l'application est exécutée doit avoir un accès en lecture. Voir aquí .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X