3

我的问题是关于在 .NET 程序集之间强制执行安全性。这是场景:

  • Foundation程序集部署在服务器上。
  • 一系列插件程序集在应用程序中提供。
  • 插件使用Foundation的功能。
  • 由于基金会提供敏感操作和数据,它必须确保插件(调用者程序集)是真实的并且来自某个发布者。

我对安全性很陌生,对强命名和数字签名有基本的了解。因此,如果您能详细解释实现上述目标的可能方法,我将不胜感激。

4

1 回答 1

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; }
    }
}
于 2013-02-05T07:24:52.200 回答