Sostituire machineKey ASP.NET in ASP.NET Core

L'implementazione dell'elemento <machineKey> in ASP.NET è sostituibile. Ciò consente la maggior parte delle chiamate a ASP.NET routine crittografiche da instradare tramite un meccanismo di protezione dei dati sostitutivo, incluso il nuovo sistema di protezione dei dati.

Installazione del pacchetto

Nota

Il nuovo sistema di protezione dei dati può essere installato solo in un'applicazione ASP.NET esistente destinata a .NET 4.5.1 o versione successiva. L'installazione avrà esito negativo se l'applicazione è destinata a .NET 4.5 o versione precedente.

Per installare il nuovo sistema di protezione dei dati in un progetto esistente ASP.NET 4.5.1+, installare il pacchetto Microsoft.AspNetCore.DataProtection.SystemWeb. Verrà creata un'istanza del sistema di protezione dei dati usando le impostazioni di configurazione predefinite.

Quando si installa il pacchetto, inserisce una riga in Web.config che indica ASP.NET di usarlo per la maggior parte delle operazioni di crittografia, tra cui l'autenticazione basata su moduli, lo stato di visualizzazione e le chiamate a MachineKey.Protect. Non usa l'API di protezione dei dati. Riga inserita come segue.

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

Suggerimento

È possibile stabilire se il nuovo sistema di protezione dati è attivo esaminando campi come __VIEWSTATE, che devono iniziare con "CfDJ8" come nell'esempio seguente. "CfDJ8" è la rappresentazione base64 dell'intestazione magic "09 F9 C9 F0" che identifica un payload protetto dal sistema di protezione dei dati.

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

Configurazione del pacchetto

Viene creata un'istanza del sistema di protezione dei dati con una configurazione predefinita zero-setup. Tuttavia, poiché per impostazione predefinita le chiavi vengono rese persistenti nel file system locale, questo non funzionerà per le applicazioni distribuite in una farm. Per risolvere questo problema, è possibile fornire la configurazione creando un tipo che sottoclassi dataProtectionStartup e ne esegue l'override del metodo ConfigureServices.

Di seguito è riportato un esempio di tipo di avvio di protezione dei dati personalizzato che ha configurato sia la posizione in cui le chiavi vengono mantenute che le modalità di crittografia dei dati inattivi. Esegue anche l'override dei criteri di isolamento delle app predefiniti specificando il proprio nome dell'applicazione.

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

Suggerimento

È anche possibile usare <machineKey applicationName="my-app" ... /> al posto di una chiamata esplicita a SetApplicationName. Si tratta di un meccanismo pratico per evitare di forzare lo sviluppatore a creare un tipo derivato da DataProtectionStartup se tutto ciò che volevano configurare era l'impostazione del nome dell'applicazione.

Per abilitare questa configurazione personalizzata, tornare a Web.config e cercare l'elemento <appSettings> aggiunto dal pacchetto al file di configurazione. Sarà simile al markup seguente:

<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>

Compilare il valore vuoto con il nome completo dell'assembly del tipo derivato da DataProtectionStartup appena creato. Se il nome dell'applicazione è DataProtectionDemo, l'aspetto sarà simile al seguente.

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

Il sistema di protezione dei dati appena configurato è ora pronto per l'uso all'interno dell'applicazione.