J'exécute un serveur de production (Windows Server 2012) avec un site Web AspNet Mvc Core RC1.
Je vois ce qui suit dans les journaux:
Neither user profile nor HKLM registry available. Using an ephemeral key repository. Protected data will be unavailable when application exits.
Après avoir inspecté le code source pour DataProtection , j'ai suivi le problème jusqu'à l'appel de méthode suivant:
Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)
Cela retourne probablement null sur le serveur pour une raison quelconque. Je n'ai pas de configuration personnalisée spéciale en place et j'ai lu les docs alors j'ai pensé que la valeur par défaut fonctionnerait.
Je pense que le problème vient du fait que le site Web IIS ne fonctionne pas dans le contexte d'un utilisateur donné, mais je ne sais pas comment confirmer ou résoudre ce problème. Mon site Web est configuré avec son propre pool.
En passant: le résultat de l'exécution d'un référentiel en mémoire pour stocker les clés entraîne leur recyclage à la fermeture de l'application, ce qui est très gênant et même pas destiné à être utilisé dans des environnements de production.
Le profil utilisateur doit être chargé dans la configuration IIS.
Ouvrez IIS, cliquez avec le bouton droit sur Pools d’applications, puis sur Paramètres avancés. Et définissez "Charger le profil utilisateur" sur true. Redémarrez votre application et cela devrait fonctionner parfaitement.
Les clés de protection des données utilisées par les applications ASP.NET sont stockées dans des ruches de registre externes aux applications. Lorsque vous exécutez votre application en tant qu'identité AppPool, vous devez créer un registre Hive pour chaque AppPool utilisé avec une application ASP.NET Core.
Pour les installations autonomes IIS, vous pouvez utiliser le script Data Protection PowerShellpour chaque pool d'applications utilisé avec une application ASP.NET Core. Les clés seront conservées dans le registre.
Comme indiqué clairement dans les journaux, étant donné que le registre Hive recherché par la protection des données n'existe pas, les clés ne seront pas conservées sur le disque. Au lieu de cela, ils seront éphémères et ne vivront que dans la mémoire.
Dans les scénarios de batterie de serveurs Web, une application peut être configurée pour utiliser un chemin UNC pour stocker son jeu de clés de protection des données. Par défaut, les clés de protection des données ne sont pas cryptées. Vous pouvez déployer un certificat x509 sur chaque ordinateur pour chiffrer le jeu de clés.
Voir le document officiel ASP.NET Core pour plus d'informations
Jetez un coup d’œil à ceci à partir du référentiel DataProtection Git
En bref, il existe un bogue dans IIS qui peut ne jamais être corrigé et empêche la configuration du registre correcte pour les clés DataProtection. Il existe un script powershell pour configurer manuellement le registre de manière à ce qu’il fonctionne avec AspNet Core. Après avoir exécuté le script pour chaque pool d'applications utilisé pour les applications AspNet Core, ces applications fonctionneront comme prévu.