我有一个正在开发的程序集,用于围绕一些潜在的敏感功能创建一个facade,我希望允许第三方调用其中包含的一些方法,但不能调用其他方法。
我如何防止第三方调用未经授权的方法,因为他们可以访问整个DLL(我不担心他们看到代码,只是执行它)?
这必须与.net紧凑框架兼容,因此不幸的是,无法使用StrongNameIdentityPermission属性。
我认为您应该提供两个Facade实现,一个用于公开所有方法的"内部"使用者,另一个用于只公开子集的外部使用者。通过拥有两个独立的构建过程,您可以在只维护一个代码库的同时实现这一点。脑海中浮现的一种技术是使用编译器指令将方法从外部构建中排除,或者如果其他公共方法需要,则将其标记为内部方法。如果您确实提供了带有内部修饰符的敏感方法,您可能还希望实现模糊处理。
编辑
也许它会更干净,而不是在每个方法周围都有使用分部类的指令,为敏感方法定义一个分部类,并将整个类实现放在一个指令中。
public partial class MyClass
{
public void NonSensitive(){}
}
#if INTERNAL_BUILD
public partial class MyClass
{
public void Sensitive(){}
}
#endif
您可以将这个分部类放在同一个或一个单独的文件中,这可能是一个很好的分离级别,因为您可以将文件名x_Sentive.cs或类似的名称前置。
描述
假设我理解你的问题。
可以使用internal
访问修饰符标记方法,使其不可从其他图书馆访问。
但这对安全透视没有帮助,因为总是可以使用反射来运行方法
内部关键字是类型和类型成员的访问修饰符。内部类型或成员只能在同一程序集中的文件中访问
更多信息
- MSDN-内部(C#参考)
如果第三方可以看到代码,那么他们就可以运行它——你无法阻止它。
请注意,如果您的应用程序正在加载第三方插件,那么您可以加载带有限制的插件程序集,以防止其使用反射-这意味着您可以将这些方法/类标记为internal
,以防止插件在应用程序中作为插件加载时调用这些方法。根据敏感功能的性质,从安全角度来看,这可能对您有用,也可能不有用。
有关如何执行此操作的信息,请参阅如何:在Sandbox 中运行部分受信任的代码
您能提供您希望第三方作为Web API使用的功能吗?他们将无法访问源代码或已编译的二进制文件。他们只能看到你想让他们看到的东西。这还将提供额外的安全功能,如呼叫者的身份验证和授权。