Compartir vía


Reemplazar machineKey> de ASP.NET en ASP.NET Core

La implementación del elemento <machineKey> en ASP.NET se puede reemplazar. Esto permite que la mayoría de las llamadas a las rutinas criptográficas de ASP.NET se enruten 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 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 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 creará una instancia del sistema de protección de datos mediante los valores de configuración predeterminados.

Al instalar el paquete, este inserta una línea en Web.config que indica a ASP.NET que la 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. En la línea que se inserta pone lo siguiente.

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

Sugerencia

Puede saber si el nuevo sistema de protección de datos está activo inspeccionando campos como __VIEWSTATE, que deben comenzar por "CfDJ8" como en el ejemplo siguiente. "CfDJ8" es la representación 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 de paquete

Se crea una instancia del sistema de protección de datos con una configuración predeterminada de configuración cero. Sin embargo, dado que, de forma predeterminada, las claves se conservan en el sistema de archivos local, esto no servirá para las aplicaciones que se implementen en una granja de servidores. Para resolverlo, puede proporcionar la configuración mediante la creación de un tipo que subclasifique DataProtectionStartup e invalide 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 rest. 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 <machineKey applicationName="my-app" ... /> en lugar de una llamada explícita a SetApplicationName. Este es un mecanismo de conveniencia para evitar forzar al desarrollador a crear un tipo derivado de DataProtectionStartup si todo lo que querían configurar era establecer el nombre de la aplicación.

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

<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, sería similar 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.