如何保护dll函数不被我的应用程序使用?

我想限制其他应用程序使用我编写的dll函数。

例如。 如果我有data.dll包含两个函数。

public void InsertInToDatabse(); public void ClearDatabase(); 

现在,如果我的应用程序调用了InsertInToDatabse()并正在做其他工作,那么如果其他应用程序通过引用database.dll调用ClearDatabase(),那么数据库将被排除。那么如何限制对这些函数forms的调用第三方申请?

如果您的dll是类库,则实际配置文件将是客户端应用程序(web.config或app.exe.config)之一,并且只有授权的应用程序将具有与用户名,密码,数据库服务器和数据库的正确连接字符串名称。

现在,即使未经授权的应用程序被阻止以您正在寻找的方式调用dll的方法,如果这些不良应用程序通过知道连接字符串直接访问数据库,它们仍然可能会乱七八糟。

这可以说,实际上只要配置在你的dll之外你就不用担心,因为只有授权的应用程序才能访问正确的数据库。

如果这种方法仍然不能满足你,那么你应该使用CAS之类的安全检查,它允许你指定哪个类或程序集可以调用某个方法,所以即使你的dll被另一个应用程序引用它也行不通。 请注意,在.NET 4中(您在问题中标记了它)整个安全层已经更改,并且与旧的.NET Framework版本的工作方式不同,请查看本文以获取更多详细信息: http : //msdn.microsoft.com/en-我们/库/ dd233103.aspx

您不能阻止人们调用您的函数,但您可以自由地实现您的function以防止这种情况。

例如,您可以锁定数据库访问,以便调用阻塞直到上一次调用完成,或者您可能有一个标志导致Clear()调用立即返回错误代码或exception。

编辑:我可能误解了这个问题。 如果您从不想要第三方代码来调用您的函数,那么请使用内部(和/或InternalsVisibleTo),如Marcus建议的那样。

正如Marcus所说,你可以使用internal关键字。 然后将InternalsVisibleToAttribute应用于您的类库,其中包含应用程序集的程序集名称和公钥,如果您使用的是强大的程序集名称。

MSDN链接

如果我没记错的话, internal关键字就是针对这些类型的情况。

编辑:如评论中所述,如果class Aassembly B ,则class C in assembly D将无法访问A

此外,正如其他答案中所指出的,您可以(并且可能应该)在ClearDatabase()使用某种forms的身份validation。

编辑2:我突然意识到这些权限应该在数据库级别,这意味着如果以下用户(具有这些权限):

 A: Insert, Update, Create 

尝试Drop Table ,然后应用程序会抛出exception(或者你处理错误),这显然会阻止他们这样做。

这并不是说您不应将ClearDatabase()设置为internal ,但如果用户(第三方正在使用)具有Drop Table权限,那么他/她将无论如何都可以。

编辑3:

 The problem is not how to secure your code, the problem is how to secure your database. – Huusom 

您可以对要保护的方法(而不是公共方法)使用内部访问权限,然后将项目标记为“朋友程序集”。 这与允许unit testing项目访问内部方法的方式相同。

以下是MSDN的Friend Assemblies文章中的描述……

只有您明确指定为朋友的程序集才能访问Friend(Visual Basic)或内部(C#)类型和成员。 例如,如果程序集B是程序集A的朋友,程序集C引用程序集B,则C无法访问A中的Friend(Visual Basic)或内部(C#)类型。

如果您询问安全性:另一种技术是使客户端传入一个参数,例如密码或加密的连接字符串。

如果您通过缓存询问限制 (例如,只允许每分钟调用一次此方法) – 那么请查看[AspNetCacheProfile]获取服务或查看Cache.Insert以获取应用程序代码。