我的问题是关于在 .NET 程序集之间强制执行安全性。这是场景:
- Foundation程序集部署在服务器上。
- 一系列插件程序集在应用程序中提供。
- 插件使用Foundation的功能。
- 由于基金会提供敏感操作和数据,它必须确保插件(调用者程序集)是真实的并且来自某个发布者。
我对安全性很陌生,对强命名和数字签名有基本的了解。因此,如果您能详细解释实现上述目标的可能方法,我将不胜感激。
我的问题是关于在 .NET 程序集之间强制执行安全性。这是场景:
我对安全性很陌生,对强命名和数字签名有基本的了解。因此,如果您能详细解释实现上述目标的可能方法,我将不胜感激。
编辑
抱歉,再次阅读您的问题时,我了解到您无法控制插件。
您想根据调用它的程序集来限制基础程序集的使用。
不幸的是,除了检查敏感部分中的调用程序集之外,没有其他方法可以做到这一点。如果您避免使用公共静态成员,则可以在构造函数中进行检查。
public class SensitiveClass {
private readonly byte[] SupplierXKey = new[] {...};
public SensitiveClass() {
var key = Assembly.CallingAssembly().GetName().GetPublicKey();
if (!key.SequenceEqual(SupplierXKey)) {
throw new SecurityException();
}
}
}
请注意,此解决方案要求您的供应商也保护他们的代码。您可能需要扩展上面的代码来检查调用者的调用者等等。
老错答案
您是否使用 MEF 加载插件?
然后,您可以创建自己的目录,只允许使用特定密钥签名的程序集。
就像是:
public class OnlyAssembliesFromX : ComposablePartCatalog
{
private readonly byte[] SupplierXKey = new[] {...};
AggregateCatalog _catalog = new AggregateCatalog();
public OnlyAssemblisFromX(string path) {
foreach (var file in Directory.GetFiles(path)) {
var key = AssemblyName.GetAssemblyName(file)
.GetPublicKey();
if (key.SequenceEqual(SupplierXKey)) {
_catalog.Catalogs.Add(new AssemblyCatalog(file));
}
}
}
public override IQueryable<ComposablePartDefinition> Parts {
get { return _aggregateCatalog.Parts; }
}
}