Così come il più noto attributo StrongNameIdentityPermission che autorizza solo gli Assembly con un dato strong name a richiamare una library (tutta intera, solo alcune classi o solo alcuni metodi) c'è anche l'attributo PublisherIdentityPermission che autorizza in base al certificato (X.509 v.3 Software Publisher's Certificate) dell'assembly chiamante.
I tool di .NET makecert.exe, cert2spc.exe e permettono di creare un certificato di test e la relativa chiave privata necessaria a creare un Assembly ed il tool signcode.exe permette infine di firmare l'assembly chiamante con il certificato. Ad esempio:
makecert -sv CertPrivateKey.pvk Cert.cer
cert2spc Cert.cer Cert.spc
signcode /spc Cert.spc /v CertprivateKey.pvk AssemblyChiamante.exe
Il seguente codice è sufficiente per dare l'autorizzazione a richiamare il metodo Class1.MetodoProtetto() ai soli Assembly firmati con Cert.cer (N.B. rispetto alla sicurezza vale quanto già detto qui):
[sysPrm.PublisherIdentityPermission(sysPrm.SecurityAction.LinkDemand, CertFile=@"Cert.cer")]
public void MetodoProtetto()
{
// ...
Il seguente codice invece permette di accedere in maniera programmatica al certificato dell'Assembly chiamante:
sysSecPol.Publisher pub =
null;
foreach (object item in sysRfl.Assembly.GetCallingAssembly().Evidence)
{
pub = item as sysSecPol.Publisher;
if (pub != null) {
Console.WriteLine("{0}\n{1}\n{2}\n{3}\n{4}\n{5}\n{6}\n{7}"
,cert.GetEffectiveDateString()
,cert.GetExpirationDateString()
,cert.GetIssuerName()
,cert.GetKeyAlgorithm()
,cert.GetPublicKeyString()
,cert.GetSerialNumberString()
,cert.GetFormat()
,cert.GetCertHashString()
);
break;
}
}
Mentre il certificato con cui viene firmato l'Assemly è un X.509 v.3, il certificato che mi risulta nella firma dell'Assembly è un X.509 v.2 e quindi non sono disponibili l'attributo ExpirationDate con il quale sarebbe possibile porre un ulteriore vincolo sulla data di validità del certificato.