Austauschen von machineKey in ASP.NET in ASP.NET Core

Die Implementierung des Elements <machineKey> in ASP.NET ist austauschbar. Dadurch können die meisten Aufrufe kryptografischer ASP.NET-Routinen durch einen alternativen Datenschutzmechanismus geleitet werden, einschließlich des neuen Datenschutzsystems.

Paketinstallation

Hinweis

Das neue Datenschutzsystem kann nur in eine bestehende ASP.NET-Anwendung installiert werden, die auf mindestens .NET 4.5.1 ausgelegt ist. Die Installation schlägt fehl, wenn die Anwendung auf .NET 4.5 oder niedriger ausgelegt ist.

Um das neue Datenschutzsystem in einem vorhandenen ASP.NET 4.5.1+-Projekt zu installieren, installieren Sie das Paket Microsoft.AspNetCore.DataProtection.SystemWeb. Dadurch wird das Datenschutzsystem mithilfe der Standardkonfigurationseinstellungen instanziiert.

Wenn Sie das Paket installieren, wird eine Zeile in Web.config eingefügt, die ASP.NET anweist, es für die meisten kryptografischen Vorgänge zu verwenden, einschließlich Formularauthentifizierung, Ansichtsstatus und Aufrufe von MachineKey.Protect. Die Datenschutz-API wird dafür nicht verwendet. Die eingefügte Zeile lautet wie folgt.

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

Tipp

Sie können feststellen, ob das neue Datenschutzsystem aktiv ist, indem Sie Felder wie __VIEWSTATE prüfen, die wie im folgenden Beispiel mit CfDJ8 beginnen müssen. CfDJ8 ist die Base64-Darstellung des Magic-Befehlsheaders 09 F0 C9 F0, der durch das Datenschutzsystem geschützte Nutzdaten bestimmt.

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

Paketkonfiguration

Das Datenschutzsystem wird mit einer Standardkonfiguration ohne Setup instanziiert. Da die Standardschlüssel jedoch im lokalen Dateisystem gespeichert werden, funktioniert dies nicht bei Anwendungen, die in einer Farm bereitgestellt werden. Um dieses Problem zu beheben, können Sie eine Konfiguration durch Erstellen eines Typs bereitstellen, der die Unterklasse DataProtectionStartup bildet und deren ConfigureServices-Methode außer Kraft setzt.

Es folgt ein Beispiel eines benutzerdefinierten Starttyps für Datenschutz, bei dem sowohl der Speicherort der Schlüssel als auch die Art der Verschlüsselung im Ruhezustand konfiguriert wird. Außerdem wird die Standardrichtlinie zur Isolation von Apps außer Kraft gesetzt, indem der eigene Anwendungsname angegeben wird.

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

Tipp

Sie können auch <machineKey applicationName="my-app" ... /> anstelle eines expliziten Aufrufs von SetApplicationName verwenden. Dies ist ein bequemer Mechanismus, um den Entwickler nicht zu zwingen, einen von DataProtectionStartup abgeleiteten Typ zu erstellen, wenn eigentlich nur der Name der Anwendung festgelegt werden soll.

Um diese benutzerdefinierte Konfiguration zu aktivieren, kehren Sie zu „Web.config“ zurück, und suchen Sie nach dem Element <appSettings>, das der Installer des Pakets der Konfigurationsdatei hinzugefügt hat. Es sieht wie im folgenden Markup aus:

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

Geben Sie in den leeren Wert den von der Assembly qualifizierten Namen des soeben erstellten, von DataProtectionStartup abgeleiteten Typs ein. Wenn der Name der Anwendung DataProtectionDemo lautet, sieht das Ergebnis wie folgt aus.

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

Das neu konfigurierte Datenschutzsystem kann jetzt in der Anwendung verwendet werden.