Sostituire l'elemento machineKey ASP.NET in ASP.NET CoreReplace the ASP.NET machineKey in ASP.NET Core

L'implementazione del <machineKey> elemento ASP.NET sostituibile.The implementation of the <machineKey> element in ASP.NET is replaceable. In questo modo la maggior parte delle chiamate alle routine di crittografia ASP.NET devono essere instradati attraverso un meccanismo di protezione dei dati di sostituzione, tra cui il nuovo sistema di protezione dati.This allows most calls to ASP.NET cryptographic routines to be routed through a replacement data protection mechanism, including the new data protection system.

Installazione del pacchettoPackage installation

Nota

Il nuovo sistema di protezione dei dati può essere solo installato in un'applicazione ASP.NET esistente destinate a .NET 4.5.1 o versioni successive.The new data protection system can only be installed into an existing ASP.NET application targeting .NET 4.5.1 or later. Installazione verrà esito negativo se l'applicazione è destinata a .NET 4.5 o in basso.Installation will fail if the application targets .NET 4.5 or lower.

Per installare il nuovo sistema di protezione dei dati in un progetto di 4.5.1+ ASP.NET esistente, installare il pacchetto Microsoft.AspNetCore.DataProtection.SystemWeb.To install the new data protection system into an existing ASP.NET 4.5.1+ project, install the package Microsoft.AspNetCore.DataProtection.SystemWeb. Si creerà un'istanza del sistema di protezione dati i dati tramite il configurazione predefinita impostazioni.This will instantiate the data protection system using the default configuration settings.

Quando si installa il pacchetto, inserita una riga in Web. config ASP.NET da utilizzare per comunicare più operazioni di crittografia, tra cui l'autenticazione basata su form, lo stato di visualizzazione e le chiamate a MachineKey. Protect.When you install the package, it inserts a line into Web.config that tells ASP.NET to use it for most cryptographic operations, including forms authentication, view state, and calls to MachineKey.Protect. La riga inserita legge come indicato di seguito.The line that's inserted reads as follows.

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

Suggerimento

È possibile indicare se il nuovo sistema di protezione dati è attivo controllando i campi, ad esempio __VIEWSTATE, che deve iniziare con "CfDJ8" come nell'esempio seguente.You can tell if the new data protection system is active by inspecting fields like __VIEWSTATE, which should begin with "CfDJ8" as in the example below. "CfDJ8" è la rappresentazione base64 dell'intestazione magic "09 F0 C9 F0" che identifica un payload protetto dal sistema di protezione dati."CfDJ8" is the base64 representation of the magic "09 F0 C9 F0" header that identifies a payload protected by the data protection system.

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

configurazione del pacchettoPackage configuration

Il sistema di protezione dati viene creata un'istanza con una configurazione di zero-programma di installazione predefinita.The data protection system is instantiated with a default zero-setup configuration. Tuttavia, poiché per impostazione predefinita le chiavi vengono rese persistenti nel file system locale, questo non funzionerà per le applicazioni che vengono distribuite in una farm.However, since by default keys are persisted to the local file system, this won't work for applications which are deployed in a farm. Per risolvere questo problema, è possibile fornire configurazione creando un tipo che crea una sottoclasse DataProtectionStartup ed esegue l'override relativo metodo ConfigureServices.To resolve this, you can provide configuration by creating a type which subclasses DataProtectionStartup and overrides its ConfigureServices method.

Di seguito è riportato un esempio di un tipo di avvio di protezione dati personalizzati che configurato sia in cui vengono salvati in modo permanente le chiavi e modo in cui si sta crittografati a riposo.Below is an example of a custom data protection startup type which configured both where keys are persisted and how they're encrypted at rest. Esegue l'override anche i criteri di isolamento di app predefinito, fornendo il proprio nome dell'applicazione.It also overrides the default app isolation policy by providing its own application name.

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.You can also use <machineKey applicationName="my-app" ... /> in place of an explicit call to SetApplicationName. Si tratta di un meccanismo utile per evitare di forzare lo sviluppatore a creare un tipo derivato DataProtectionStartup se tutto è quindi necessario configurare l'impostazione del nome dell'applicazione.This is a convenience mechanism to avoid forcing the developer to create a DataProtectionStartup-derived type if all they wanted to configure was setting the application name.

Per abilitare questa configurazione personalizzata, tornare al file Web. config e cercare il <appSettings> elemento che installano il pacchetto aggiunto al file di configurazione.To enable this custom configuration, go back to Web.config and look for the <appSettings> element that the package install added to the config file. Sarà simile al markup seguente:It will look like the following markup:

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

Immettere il valore vuoto con il nome qualificato dall'assembly del tipo derivato DataProtectionStartup che appena creato.Fill in the blank value with the assembly-qualified name of the DataProtectionStartup-derived type you just created. Se il nome dell'applicazione è DataProtectionDemo, riportato di seguito.If the name of the application is DataProtectionDemo, this would look like the below.

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

Il sistema di protezione dati appena configurato è ora pronto per l'utilizzo all'interno dell'applicazione.The newly-configured data protection system is now ready for use inside the application.