模块化应用程序模式:如何检查哪个是调用模块

时间:2015-12-14 14:52:41

标签: c# security prism modularity

我目前正在使用prism 5.0在c#.NET 4.5中编写模块化桌面应用程序。

我的应用程序由“核心”(或主机)和几个模块组成。 我的每个模块都在实现prism提供的IModule接口。 我的应用程序的核心为模块提供了一个“API”,以便它们可以与应用程序/其他模块轻松交互。例如,“API”允许模块发布或订阅事件或与BDD通信。

这是我的问题:

BDD中有一些敏感信息,我事先并不知道将运行哪个模块。我想处理“恶意”模块的可能性:我想在我的宿主应用程序中添加一层安全性。例如,我想检查模块是否有权删除BDD中的内容。 我怎么能这样做?我已经拥有存储在BDD中的每个模块的权限,但我怎么知道哪个模块以安全的方式调用API?

所有事情都应该动态完成,因为我事先并不知道将运行哪个模块。

现在我想到了这个:

  • 对API的调用应该采用额外的参数:Type。但是,模块可以通过执行typeof(someType)

  • 轻松伪造某种类型
  • 对API的调用应该采用额外的参数:IModule:调用模块将自己发送(this)作为参数,以便我可以检查API中的类型。但是再一次调用模块仍然可以通过提供的UnityContainer或其他方式获取另一个模块的实例来轻松伪造它。

  • 通过StackFrame检查调用对象的类型。这个可能是“更安全”,但在我看来它真的很重,很脏。

还有其他方法吗?我对c#和模块化模式很新,我确定我错过了什么。

编辑:我将使用sboutzen的方法在加载程序集时验证我的模块。如果模块是一个已知的模块,我会给他一个随机生成的密钥。每次模块想要调用API时,他都必须提供所提供的密钥,以便我可以检查他的身份。

这是我能想到的最安全的事情。

1 个答案:

答案 0 :(得分:0)

您可以使用强名称模块。 见https://msdn.microsoft.com/en-us/library/xc31ft41%28v=vs.110%29.aspx。这样您就可以对每个模块(程序集)进行身份验证和授权。