Dela via


Ersätt ASP.NET machineKey i ASP.NET Core

Implementeringen av elementet <machineKey> i ASP.NET kan ersättas. Detta gör att de flesta anrop till ASP.NET kryptografiska rutiner kan dirigeras via en ersättningsmekanism för dataskydd, inklusive det nya dataskyddssystemet.

Paketinstallation

Not

Det nya dataskyddssystemet kan bara installeras i ett befintligt ASP.NET program som är riktat mot .NET 4.5.1 eller senare. Installationen misslyckas om programmet är avsett för .NET 4.5 eller lägre.

Installera det nya dataskyddssystemet i ett befintligt ASP.NET 4.5.1+-projekt genom att installera paketet Microsoft.AspNetCore.DataProtection.SystemWeb. Detta instansierar dataskyddssystemet med hjälp av standardkonfiguration inställningar.

När du installerar paketet infogas en rad i Web.config som talar om för ASP.NET att använda det för de flesta kryptografiska operationer, inklusive formulärautentisering, ViewState och anrop till MachineKey.Protect. Den använder inte -API:et för dataskydd. Raden som infogas lyder som följer.

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

Tips

Du kan se om det nya dataskyddssystemet är aktivt genom att granska fält som __VIEWSTATE, som bör börja med "CfDJ8" som i exemplet nedan. "CfDJ8" är base64-representationen av den magiska rubriken "09 F0 C9 F0" som identifierar en nyttolast som skyddas av dataskyddssystemet.

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

Paketkonfiguration

Dataskyddssystemet instansieras med en standardkonfiguration med noll installation. Men eftersom standardnycklar sparas i det lokala filsystemet fungerar detta inte för program som distribueras i en servergrupp. För att lösa detta kan du ange konfiguration genom att skapa en typ som underklasser DataProtectionStartup och åsidosätter dess ConfigureServices-metod.

Nedan visas ett exempel på en anpassad starttyp för dataskydd som konfigurerade både var nycklar sparas och hur de krypteras i vila. Den åsidosätter också standardprincipen för appisolering genom att ange ett eget programnamn.

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

Tips

Du kan också använda <machineKey applicationName="my-app" ... /> i stället för ett explicit anrop till SetApplicationName. Det här är en bekvämlighetsmekanism för att undvika att tvinga utvecklaren att skapa en DataProtectionStartup-härledd typ om allt de ville konfigurera var att ange programnamnet.

Om du vill aktivera den här anpassade konfigurationen går du tillbaka till Web.config och letar efter det <appSettings> element som paketinstallationen lade till i konfigurationsfilen. Det ser ut som följande markering:

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

Fyll i det tomma värdet med det sammansättningskvalificerade namnet på den DataProtectionStartup-härledda typ som du nyss skapade. Om namnet på programmet är DataProtectionDemo skulle det se ut som nedan.

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

Det nyligen konfigurerade dataskyddssystemet är nu redo att användas i programmet.