Zastąp ASP.NET machineKey w ASP.NET Core

Implementacja <machineKey> elementu w ASP.NET można zastąpić. Dzięki temu większość wywołań ASP.NET procedur kryptograficznych, które mają być kierowane przez mechanizm ochrony danych zastępczych, w tym nowy system ochrony danych.

Instalacja pakietu

Uwaga

Nowy system ochrony danych można zainstalować tylko w istniejącej aplikacji ASP.NET przeznaczonej dla platformy .NET 4.5.1 lub nowszej. Instalacja zakończy się niepowodzeniem, jeśli aplikacja będzie przeznaczona dla platformy .NET 4.5 lub nowszej.

Aby zainstalować nowy system ochrony danych w istniejącym projekcie ASP.NET 4.5.1 lub nowszym, zainstaluj pakiet Microsoft.AspNetCore.DataProtection.SystemWeb. Spowoduje to utworzenie wystąpienia systemu ochrony danych przy użyciu domyślnych ustawień konfiguracji .

Po zainstalowaniu pakietu wstawia wiersz do pliku Web.config , który informuje, ASP.NET używać go w przypadku większości operacji kryptograficznych, w tym uwierzytelniania formularzy, stanu wyświetlania i wywołań funkcji MachineKey.Protect. Nie korzysta z interfejsu API ochrony danych. Wstawiony wiersz odczytuje w następujący sposób.

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

Napiwek

Możesz sprawdzić, czy nowy system ochrony danych jest aktywny, sprawdzając pola, takie jak __VIEWSTATE, które powinny zaczynać się od "CfDJ8", jak w poniższym przykładzie. "CfDJ8" jest reprezentacją base64 magicznego nagłówka "09 F0 F9 F0", który identyfikuje ładunek chroniony przez system ochrony danych.

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

Konfiguracja pakietu

System ochrony danych jest tworzone przy użyciu domyślnej konfiguracji zerowej. Jednak ponieważ domyślnie klucze są utrwalane w lokalnym systemie plików, nie będzie to działać w przypadku aplikacji wdrożonych w farmie. Aby rozwiązać ten problem, możesz podać konfigurację, tworząc typ, który podklasy DataProtectionStartup i zastępuje jego metodę ConfigureServices.

Poniżej znajduje się przykład niestandardowego typu uruchamiania ochrony danych, który skonfigurował zarówno lokalizację utrwalania kluczy, jak i sposób ich szyfrowania w spoczynku. Zastępuje również domyślne zasady izolacji aplikacji, podając własną nazwę aplikacji.

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

Napiwek

Można również użyć <machineKey applicationName="my-app" ... /> zamiast jawnego wywołania polecenia SetApplicationName. Jest to mechanizm wygody, aby uniknąć wymuszania przez dewelopera utworzenia typu pochodnego DataProtectionStartup, jeśli wszystko, co chcieli skonfigurować, było ustawienie nazwy aplikacji.

Aby włączyć tę konfigurację niestandardową, wróć do pliku Web.config i poszukaj elementu dodanego <appSettings> do pliku konfiguracji pakietu. Będzie on wyglądać podobnie do następującego znacznika:

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

Wypełnij pustą wartość nazwą kwalifikowaną przez zestaw typu DataProtectionStartup utworzonego właśnie. Jeśli nazwa aplikacji to DataProtectionDemo, będzie ona wyglądać następująco.

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

Nowo skonfigurowany system ochrony danych jest teraz gotowy do użycia w aplikacji.