Reemplace el ASP.NET machineKey en ASP.NET Core

La implementación del <machineKey> elemento en ASP.NET es reemplazable. Esto permite que la mayoría de las ASP.NET las rutinas criptográficas se enrute a través de un mecanismo de protección de datos de reemplazo, incluido el nuevo sistema de protección de datos.

Instalación del paquete

Nota

El nuevo sistema de protección de datos solo se puede instalar en una aplicación de ASP.NET existente destinada a .NET 4.5.1 o posterior. Se producirá un error en la instalación si la aplicación tiene como destino .NET 4.5 o una versión inferior.

Para instalar el nuevo sistema de protección de datos en un proyecto existente ASP.NET 4.5.1+, instale el paquete Microsoft.AspNetCore.DataProtection.SystemWeb. Esto crea una instancia del sistema de protección de datos con las opciones de configuración predeterminadas.

Al instalar el paquete, inserta una línea en Web.config que indica a ASP.NET que lo use para la mayoría de las operaciones criptográficas, incluida la autenticación de formularios, el estado de vista y las llamadas a MachineKey.Protect. No usa la API de protección de datos. La línea que se inserta lee como se muestra a continuación.

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

Sugerencia

Puede saber si el nuevo sistema de protección de datos está activo inspeccionando campos como , que debe comenzar por __VIEWSTATE "CfDJ8", como en el ejemplo siguiente. "CfDJ8" es la representación en base64 del encabezado mágico "09 F0 C9 F0" que identifica una carga protegida por el sistema de protección de datos.

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

Configuración del paquete

Se crea una instancia del sistema de protección de datos con una configuración predeterminada de configuración de cero. Sin embargo, dado que de forma predeterminada las claves se conservan en el sistema de archivos local, esto no funcionará para las aplicaciones que se implementan en una granja de servidores. Para resolver este problema, puede proporcionar configuración mediante la creación de un tipo que crea subclases DataProtectionStartup e invalida su método ConfigureServices.

A continuación se muestra un ejemplo de un tipo de inicio de protección de datos personalizado que configura tanto dónde se conservan las claves como cómo se cifran en reposo. También invalida la directiva de aislamiento de aplicaciones predeterminada proporcionando su propio nombre de aplicación.

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

Sugerencia

También puede usar en <machineKey applicationName="my-app" ... /> lugar de una llamada explícita a SetApplicationName. Se trata de un mecanismo práctico para evitar forzar al desarrollador a crear un tipo derivado de DataProtectionStartup si lo único que desea configurar era establecer el nombre de la aplicación.

Para habilitar esta configuración personalizada, vuelva a Web.config y busque el elemento que el paquete <appSettings> instala agregado al archivo de configuración. Tendrá un aspecto parecido al siguiente marcado:

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

Rellene el valor en blanco con el nombre completo del ensamblado del tipo derivado de DataProtectionStartup que acaba de crear. Si el nombre de la aplicación es DataProtectionDemo, tendría un aspecto parecido al siguiente.

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

El sistema de protección de datos recién configurado ya está listo para su uso dentro de la aplicación.