Nombres seguros

Nombres seguros se refiere a firmar un ensamblado con una clave, generando un ensamblado con nombre seguro. Una vez que un ensamblado tiene un nombre seguro, crea una identidad única en función del nombre y del número de versión del ensamblado y puede ayudar a evitar conflictos de ensamblado.

El inconveniente de los nombres seguros es que .NET Framework en Windows habilita la carga estricta de ensamblados una vez que un ensamblado tiene un nombre seguro. Una referencia de ensamblado con nombre seguro debe coincidir exactamente con la versión del ensamblado cargado, obligando a los desarrolladores a configurar redirecciones de enlace cuando se usa el ensamblado:

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <dependentAssembly>
            <assemblyIdentity name="myAssembly" publicKeyToken="32ab4ba45e0a69a1" culture="neutral" />
            <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0"/>
         </dependentAssembly>
      </assemblyBinding>
   </runtime>
</configuration>

Cuando los desarrolladores de .NET se quejan de los nombres seguros, normalmente se quejan de la carga estricta de los ensamblados. Afortunadamente, este problema está aislado en .NET Framework. .NET 5 y versiones posteriores, .NET Core, Xamarin, UWP y la mayoría del resto de implementaciones de .NET carecen de la carga estricta de ensamblados, que es el principal inconveniente de los nombres seguros.

Un aspecto importante de los nombres seguros en .NET Framework es que son virales: a un ensamblado con nombre seguro solamente le pueden hacer referencia otros ensamblados con nombre seguro. Si la biblioteca no tiene un nombre seguro, las aplicaciones y bibliotecas de .NET Framework que necesiten nombres seguros no podrán usarla.

Las ventajas de los nombres seguros en .NET Framework son:

  1. Otros ensamblados con nombre seguro pueden hacer referencia al ensamblado y usarlo.
  2. El ensamblado se puede almacenar en la memoria caché global de ensamblados (GAC).
  3. El ensamblado se puede cargar en paralelo con otras versiones de dicho ensamblado. Normalmente, las aplicaciones con arquitecturas de complemento requieren la carga de ensamblados en paralelo.

Los nombres seguros no tienen ventajas en .NET Core/5+. El compilador de C# genera una advertencia de CS8002 para ensamblados con nombre seguro que hagan referencia a ensamblados con nombre no seguro. Está bien suprimir esta advertencia para las bibliotecas que tengan como destino solo .NET Core/5+.

Creación de bibliotecas de .NET con nombre seguro

Se debería asignar un nombre seguro a las bibliotecas de .NET de código abierto si sus destinos incluyen .NET Framework o .NET Standard. Los nombres seguros no son necesarios para las bibliotecas que tengan como destino solo .NET Core/5+.

Nota:

Esta guía es específica de las bibliotecas de .NET distribuidas públicamente, como las bibliotecas de .NET publicadas en NuGet.org. La mayoría de las aplicaciones .NET no necesitan nombres seguros y estos no se deben utilizar de forma predeterminada.

✔️ ES RECOMENDABLE usar nombres seguros en los ensamblados de la biblioteca.

✔️ ES RECOMENDABLE agregar la clave de nombres seguros al sistema de control de código fuente.

Una clave disponible públicamente permite a los programadores modificar y volver a compilar el código fuente de la biblioteca con la misma clave.

No debería publicar la clave de nombres seguros si se ha utilizado en el pasado para conceder permisos especiales en escenarios de confianza parcial. En caso contrario, podría poner en peligro los entornos existentes.

Importante

Cuando se desea la identidad del publicador del código, se recomiendan Authenticode y la firma de paquetes NuGet. La seguridad de acceso del código (CAS) no debe usarse como una mitigación de seguridad.

✔️ ES RECOMENDABLE incrementar la versión de ensamblado solamente en los cambios de versión principal para ayudar a los usuarios a reducir las redirecciones de enlace y la frecuencia con la que se actualizan.

Obtenga más información sobre el control de versiones y la versión del ensamblado.

❌ NO agregue, quite ni cambie la clave de nombres seguros.

La modificación de la clave de nombre seguro de un ensamblado cambia la identidad de este e interrumpe el código compilado que lo utiliza. Para más información, vea la información sobre cambios importantes binarios.

❌ NO publique versiones de la biblioteca tanto con nombre seguro como sin él. Por ejemplo, Contoso.Api y Contoso.Api.StrongNamed.

La publicación de dos paquetes bifurca el ecosistema del desarrollador. Además, si una aplicación termina dependiendo de ambos paquetes, el desarrollador puede encontrar conflictos con el nombre de tipo. En lo que respecta a .NET, son tipos distintos en diferentes ensamblados.