Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
La denominazione forte si riferisce alla firma di un assembly con una chiave, generando un assembly con nome sicuro. Quando un assembly è denominato con un nome forte, crea un'identità univoca basata sul nome e sul numero di versione dell'assembly e può contribuire a evitare conflitti tra assembly.
Lo svantaggio della denominazione forte è che .NET Framework su Windows consente il caricamento rigoroso degli assembly una volta che un assembly è fortemente nominato. Un riferimento ad assembly con nome forte deve corrispondere esattamente alla versione dell'assembly caricato, il che costringe gli sviluppatori a configurare i reindirizzamenti di binding quando utilizzano l'assembly.
<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>
Quando gli sviluppatori .NET si lamentano del naming forte, ciò di cui in genere si lamentano è il caricamento stretto delle assembly. Fortunatamente, questo problema è isolato in .NET Framework. .NET 5+, .NET Core, UWP e la maggior parte delle altre implementazioni .NET non hanno un caricamento rigoroso degli assembly, che è il principale svantaggio del naming forte.
Un aspetto importante della denominazione complessa in .NET Framework è che è virale: un assembly con nome sicuro può fare riferimento solo ad altri assembly con nome sicuro. Se la libreria non è con nome sicuro, le app e le librerie di .NET Framework che richiedono nomi sicuri non possono usarla.
I vantaggi della denominazione avanzata in .NET Framework sono i seguenti:
- È possibile fare riferimento all'assembly e utilizzarlo da altri assembly con nome sicuro.
- L'assembly può essere archiviato nella Global Assembly Cache (GAC).
- L'assembly può essere caricato affiancato ad altre versioni dell'assembly. Il caricamento di assembly side-by-side è comunemente richiesto dalle applicazioni con architetture plug-in.
La denominazione avanzata non offre vantaggi per .NET Core/5+. Il compilatore C# genera un avviso CS8002 per gli assembly con nome sicuro che fanno riferimento ad assembly con nome non sicuro. È consigliabile eliminare questo avviso per le librerie destinate solo a .NET Core/5+.
Quando applicare un nome sicuro alle librerie .NET
La denominazione avanzata non è necessaria per le librerie destinate solo a .NET Core/5+. È consigliabile assegnare un nome sicuro alle librerie .NET open source se le relative destinazioni includono .NET Framework o .NET Standard.
Annotazioni
Queste linee guida sono specifiche per le librerie .NET distribuite pubblicamente, ad esempio le librerie .NET pubblicate in NuGet.org. La denominazione avanzata non è necessaria per la maggior parte delle applicazioni .NET e non deve essere eseguita per impostazione predefinita.
✔️ PRENDERE IN CONSIDERAZIONE il naming forte degli assembly della libreria se si usa solo .NET Framework o .NET Standard.
La denominazione avanzata non ha alcun impatto sui runtime .NET moderni. Se la libreria è destinata solo a .NET moderno, non è necessario assegnare un nome sicuro agli assembly.
Se si utilizza il multi-targeting tra .NET Framework/.NET Standard e .NET moderno, dovresti utilizzare il strong name su tutti i framework di destinazione.
Considerare l'aggiunta della coppia di chiavi di denominazione forte (pubblica + privata) al sistema di controllo del codice sorgente.
Una coppia di chiavi disponibile pubblicamente consente agli sviluppatori di modificare e ricompilare il codice sorgente della libreria con la stessa chiave.
Non è consigliabile rendere pubblica la coppia di chiavi di denominazione avanzata se è stata usata in passato per concedere autorizzazioni speciali in scenari parzialmente attendibili. In caso contrario, è possibile compromettere gli ambienti esistenti.
Se non è possibile registrare la coppia di chiavi pubblica e privata, registrare la chiave pubblica e usare la firma pubblica per il processo di compilazione regolare. La firma pubblica consente comunque agli sviluppatori di ricompilare e usare la libreria nella maggior parte degli scenari.
Importante
Quando si desidera l'identità del server di pubblicazione del codice, è consigliabile usare Authenticode e Firma del pacchetto NuGet . La sicurezza dall'accesso al codice non deve essere usata come mitigazione della sicurezza.
✔️ PRENDERE IN CONSIDERAZIONE di incrementare la versione dell'assembly solo per le modifiche di versione principali per consentire agli utenti di ridurre i reindirizzamenti di binding e la frequenza con cui questi ultimi vengono aggiornati.
Altre informazioni sul controllo delle versioni e sulla versione dell'assembly.
❌ NON aggiungere, rimuovere o modificare la chiave di denominazione complessa.
La modifica della chiave di nome sicuro di un assembly modifica l'identità dell'assembly e rende inutilizzabile il codice compilato che lo usa. Per ulteriori informazioni, vedere Modifiche binarie che causano interruzioni.
❌ NON pubblicare versioni con nome sicuro e non con nome sicuro della libreria. Ad esempio, Contoso.Api e Contoso.Api.StrongNamed.
Pubblicare due pacchetti biforca l'ecosistema degli sviluppatori. Inoltre, se un'applicazione finisce per dipendere da entrambi i pacchetti, lo sviluppatore può riscontrare conflitti di nomi dei tipi. Per quanto riguarda .NET, sono tipologie diverse in moduli diversi.