我的问题是关于在.NET程序集之间强制执行安全性。这是场景:
我对安全性很陌生,并且对Strong-Naming和Digital Signatures有基本的把握。所以,如果你能够详细解释完成上述目标的可能方法,我将不胜感激。
答案 0 :(得分:3)
修改强>
抱歉,再次阅读您的问题时,我知道您无法控制插件。
您希望根据调用它的程序集来限制基础程序集的使用。
不幸的是,除了检查敏感部件中的调用组件之外没有其他方法可以做到这一点。如果您避免使用公共静态成员,则可以在构造函数中进行检查。
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; }
}
}