Remplacer machineKey d’ASP.NET dans ASP.NET Core

L’implémentation de l’élément <machineKey> dans ASP.NET est remplaçable. Cela permet à la plupart des appels aux routines de chiffrement ASP.NET d’être routées via un mécanisme de protection des données de remplacement, y compris le nouveau système de protection des données.

Installation de package

Notes

Le nouveau système de protection des données ne peut être installé que dans une application ASP.NET existante ciblant .NET 4.5.1 ou une version ultérieure. L’installation échoue si l’application cible .NET 4.5 ou une version antérieure.

Pour installer le nouveau système de protection des données dans un projet ASP.NET 4.5.1+ existant, installez le package Microsoft.AspNetCore.DataProtection.SystemWeb. Cela instancie le système de protection des données à l’aide des paramètres de configuration par défaut.

Lorsque vous installez le package, il insère une ligne dans Web.config qui indique à ASP.NET de l’utiliser pour la plupart des opérations de chiffrement, notamment l’authentification par formulaire, l’état d’affichage et les appels à MachineKey.Protect. Il n’utilise pas l’API de protection des données. La ligne insérée se lit comme suit.

<machineKey compatibilityMode="Framework45" dataProtectorType="..." />

Conseil

Vous pouvez déterminer si le nouveau système de protection des données est actif en inspectant des champs comme __VIEWSTATE, qui doit commencer par « CfDJ8 », comme dans l’exemple ci-dessous. « CfDJ8 » est la représentation en base64 de l’en-tête magic « 09 F0 C9 F0 » qui identifie une charge utile protégée par le système de protection des données.

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="CfDJ8AWPr2EQPTBGs3L2GCZOpk...">

Configuration de package

Le système de protection des données est instancié avec une configuration zéro par défaut. Toutefois, étant donné que les clés sont conservées par défaut dans le système de fichiers local, cela ne fonctionne pas pour les applications déployées dans une batterie de serveurs. Pour résoudre ce problème, vous pouvez fournir une configuration en créant un type qui sous-classe DataProtectionStartup et remplace sa méthode ConfigureServices.

Vous trouverez ci-dessous un exemple de type de démarrage de protection des données personnalisé qui a configuré à la fois l’emplacement où les clés sont conservées et la façon dont elles sont chiffrées au repos. Il remplace également la stratégie d’isolation d’application par défaut en fournissant son propre nom d’application.

using System;
using System.IO;
using Microsoft.AspNetCore.DataProtection;
using Microsoft.AspNetCore.DataProtection.SystemWeb;
using Microsoft.Extensions.DependencyInjection;

namespace DataProtectionDemo
{
    public class MyDataProtectionStartup : DataProtectionStartup
    {
        public override void ConfigureServices(IServiceCollection services)
        {
            services.AddDataProtection()
                .SetApplicationName("my-app")
                .PersistKeysToFileSystem(new DirectoryInfo(@"\\server\share\myapp-keys\"))
                .ProtectKeysWithCertificate("thumbprint");
        }
    }
}

Conseil

Vous pouvez également utiliser <machineKey applicationName="my-app" ... /> à la place d’un appel explicite à SetApplicationName. Il s’agit d’un mécanisme pratique pour éviter d’obliger le développeur à créer un type dérivé de DataProtectionStartup s’il souhaite simplement configurer le nom de l’application.

Pour activer cette configuration personnalisée, revenez à Web.config et recherchez l’élément <appSettings> que l’installation du package a ajouté au fichier config. Il ressemblera à la balise suivante :

<appSettings>
  <!--
  If you want to customize the behavior of the ASP.NET Core Data Protection stack, set the
  "aspnet:dataProtectionStartupType" switch below to be the fully-qualified name of a
  type which subclasses Microsoft.AspNetCore.DataProtection.SystemWeb.DataProtectionStartup.
  -->
  <add key="aspnet:dataProtectionStartupType" value="" />
</appSettings>

Renseignez la valeur vide avec le nom de type qualifié d’assembly du type dérivé de DataProtectionStartup que vous venez de créer. Si le nom de l’application est DataProtectionDemo, cela ressemblerait à ce qui suit.

<add key="aspnet:dataProtectionStartupType"
     value="DataProtectionDemo.MyDataProtectionStartup, DataProtectionDemo" />

Le système de protection des données nouvellement configuré est maintenant prêt à être utilisé dans l’application.