Delen via


De ASP.NET machineKey in ASP.NET Core vervangen

De implementatie van het <machineKey> element in ASP.NET is vervangbaar. Hierdoor kunnen de meeste aanroepen naar ASP.NET cryptografische routines worden gerouteerd via een vervangend mechanisme voor gegevensbeveiliging, waaronder het nieuwe systeem voor gegevensbeveiliging.

Pakketinstallatie

Notitie

Het nieuwe systeem voor gegevensbeveiliging kan alleen worden geïnstalleerd in een bestaande ASP.NET-toepassing die gericht is op .NET Framework 4.5.1 of hoger. De installatie mislukt als de toepassing is gericht op .NET Framework 4.5 of lager.

Als u het nieuwe systeem voor gegevensbeveiliging wilt installeren in een bestaand .NET Framework 4.5.1+ project, installeert u het pakket Microsoft.AspNetCore.DataProtection.SystemWeb. Hiermee wordt het systeem voor gegevensbeveiliging geïnstitueert met behulp van de standaardconfiguratie instellingen.

Wanneer u het pakket installeert, wordt er een regel ingevoegd in Web.config die aangeeft dat ASP.NET het moet gebruiken voor meeste cryptografische bewerkingen, waaronder formulierverificatie, weergavestatus en aanroepen naar MachineKey.Protect. Er wordt geen gebruikgemaakt van de API voor gegevensbeveiliging. De regel die als volgt is ingevoegd.

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

Fooi

U kunt zien of het nieuwe systeem voor gegevensbeveiliging actief is door velden zoals __VIEWSTATEte inspecteren, die moeten beginnen met CfDJ8, zoals in het onderstaande voorbeeld. "CfDJ8" is de base64-weergave van de magische "09 F0 C9 F0" header die een payload identificeert die wordt beschermd door het systeem voor databescherming.

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

Pakketconfiguratie

Het systeem voor gegevensbeveiliging wordt geïnstantieerd met een standaardconfiguratie zonder installatie. Omdat standaardsleutels echter worden bewaard in het lokale bestandssysteem, werkt dit niet voor toepassingen die in een farm zijn geïmplementeerd. U kunt dit oplossen door een type te maken dat afstamt van DataProtectionStartup en de methode ConfigureServices overschrijft.

Hieronder ziet u een voorbeeld van een opstarttype van een startup voor aangepaste gegevensbeveiliging, dat is geconfigureerd voor waar sleutels worden opgeslagen en hoe ze worden versleuteld wanneer niet in gebruik. Het overschrijft ook het standaardbeleid voor app-isolatie door een eigen toepassingsnaam op te geven.

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

Fooi

U kunt ook <machineKey applicationName="my-app" ... /> gebruiken in plaats van een expliciete aanroep naar SetApplicationName. Dit is een praktisch mechanisme om te voorkomen dat de ontwikkelaar een afgeleid DataProtectionStartuptype maakt, als al wat zij willen configureren het instellen van de naam van de toepassing is.

Als u deze aangepaste configuratie wilt inschakelen, gaat u terug naar Web.config en zoekt u naar het <appSettings>-element dat de pakketinstallatie heeft toegevoegd aan het configuratiebestand. Deze ziet eruit als de volgende markeringen:

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

Vul de lege waarde in met de assembly-gekwalificeerde naam van het type DataProtectionStartup dat u zojuist hebt gemaakt. Als de naam van de toepassing DataProtectionDemo is, ziet dit er als volgt uit.

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

Het zojuist geconfigureerde systeem voor gegevensbeveiliging is nu klaar voor gebruik in de toepassing.