Ersetzen des ASP.NET machineKey in ASP.NET Core

Die Implementierung des <machineKey> Elements in ASP.NET ist austauschbar. Dadurch können die meisten Aufrufe ASP.NET kryptografischen Routinen über einen Ersatzdatenschutzmechanismus weitergeleitet werden, einschließlich des neuen Datenschutzsystems.

Paketinstallation

Hinweis

Das neue Datenschutzsystem kann nur in einer vorhandenen ASP.NET Anwendung für .NET 4.5.1 oder höher installiert werden. Die Installation schlägt fehl, wenn die Anwendung auf .NET 4.5 oder niedriger ausgerichtet 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 instanziieren.

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

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

Tipp

Sie können feststellen, ob das neue Datenschutzsystem aktiv ist, indem Sie Felder wie __VIEWSTATE"CfDJ8" prüfen, die wie im folgenden Beispiel mit "CfDJ8" beginnen sollten. "CfDJ8" ist die Base64-Darstellung des magischen "09 F0 C9 F0"-Headers, der eine Nutzlast identifiziert, die durch das Datenschutzsystem geschützt ist.

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

Paketkonfiguration

Das Datenschutzsystem wird mit einer standardmäßigen Null-Setup-Konfiguration instanziiert. Da standardmäßig Schlüssel jedoch im lokalen Dateisystem beibehalten werden, funktioniert dies nicht für Anwendungen, die in einer Farm bereitgestellt werden. Um dies zu beheben, können Sie eine Konfiguration bereitstellen, indem Sie einen Typ erstellen, der DataProtectionStartup unterklassiert und seine ConfigureServices-Methode außer Kraft setzt.

Nachfolgend finden Sie ein Beispiel für einen benutzerdefinierten Starttyp für den Datenschutz, der sowohl konfiguriert wurde, wo Schlüssel beibehalten werden als auch wie sie ruhend verschlüsselt werden. Außerdem wird die Standard-App-Isolationsrichtlinie überschrieben, indem sie einen eigenen Anwendungsnamen bereitstellt.

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 anstelle eines expliziten Aufrufs von SetApplicationName verwenden <machineKey applicationName="my-app" ... /> . Dies ist ein Komfortmechanismus, um zu vermeiden, dass der Entwickler gezwungen wird, einen abgeleiteten DataProtectionStartup-Typ zu erstellen, wenn alles, was sie konfigurieren möchten, den Anwendungsnamen festgelegt hat.

Um diese benutzerdefinierte Konfiguration zu aktivieren, wechseln Sie zu Web.config, und suchen Sie nach dem <appSettings> Element, das das Paket installiert hat, das der Konfigurationsdatei hinzugefügt wurde. Es sieht wie das folgende 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>

Füllen Sie den leeren Wert mit dem assemblyqualifizierten Namen des soeben erstellten DataProtectionStartup-abgeleiteten Typs aus. Wenn der Name der Anwendung "DataProtectionDemo" lautet, sieht dies wie unten aus.

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

Das neu konfigurierte Datenschutzsystem ist jetzt für die Verwendung innerhalb der Anwendung bereit.