Унаследованное мною старое веб-приложение .NET изобилует странной «проверкой безопасности сборки»: оно проверяет, что открытый ключ имени вызывающей сборки имеет ту же длину, что и открытый ключ имени выполняющейся сборки.
Звонки выглядят так:
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, а не веб-приложением? Поскольку это веб-приложение, мы полностью контролируем, какие библиотеки DLL находятся на сервере, поэтому никакой угрозы безопасности, верно?
(При необходимости могу предоставить дополнительную информацию).