我继承的一个旧 .NET Web 应用程序充满了奇怪的“程序集安全检查”:它检查调用程序集名称的公钥是否与执行程序集名称的公钥长度相同。
调用如下所示:
CheckAssembly(System.Reflection.Assembly.GetCallingAssembly(), System.Reflection.Assembly.GetExecutingAssembly(), this);
......那个方法是:
public static void CheckAssembly(Assembly callingAssembly, Assembly executingAssembly, object useObject)
{
byte[] assemblyPublicKey = executingAssembly.GetName().GetPublicKey();
byte[] callingPublicKey = callingAssembly.GetName().GetPublicKey();
if (callingPublicKey == null || assemblyPublicKey.Length != callingPublicKey.Length)
{
throw new SecurityException("The calling assembly does not have permission to use objects of type '" + useObject.GetType().FullName + "'");
}
for (int i = 0; i < assemblyPublicKey.Length; i++)
{
if (assemblyPublicKey[i] != callingPublicKey[i])
{
throw new SecurityException("The calling assembly does not have permission to use objects of type '" + useObject.GetType().FullName + "'");
}
}
}
我认为它正在检查它的程序集(DLL 文件)是否没有被交换或修改或任何东西。那是对的吗?如果不是,这段代码在做什么?关于为什么会写它的任何猜测?
我认为 .net 框架无论如何都会这样做,如果需要的话。正确的?
也许这是应用程序是 winforms 应用程序而不是 Web 应用程序时的旧代码?由于它是一个网络应用程序,我们可以完全控制服务器上的 DLL,所以没有安全风险,对吗?
(如果需要,可以提供更多信息)。