Это просто невозможно.
Вся система безопасности доступа к коду основана на представлении о том, что решения о безопасности принимаются от пользователя, выполняющего код , а не от автора кода . Вы, автор кода, не можете сказать своим пользователям, каковы их решения по безопасности; Вы слуга пользователя, а не хозяин пользователя.
Теперь вы можете усложнить для стороннего кода для использования вашего кода. Вы можете использовать различные атрибуты безопасности для документа , что ваше намерение заключается в том, чтобы сторонний код не использовал ваш код. Это хорошие шаги, но они на самом деле не решают вашу проблему в любом мире, где ваши пользователи враждебны к вам. В модели CAS пользователи всегда побеждают.
Например: у вас могут быть методы в вашем коде, выполняющие требования безопасности, которые запускают обход стека, чтобы проверить, есть ли у каждого в стеке вызовов определенные доказательства, связанные с ними. Например, доказательства того, что «эта DLL была подписана закрытым ключом Гийома со строгим именем, который заперт в ящике в офисе Гийома», были бы хорошим доказательством для проверки. Это почти гарантирует, что каждый, кто вызывает ваш код, также является вашим кодом.
Но это не цель подписания строгого имени; Цель подписи строгого имени - помочь пользователю узнать, что код, который, по его мнению, выполняется, на самом деле был получен от вас. Как мы увидим, использование инструмента безопасности для целей, для которых оно не предназначалось, опасно. Это дает вам совершенно ложное чувство безопасности.
Предположим, ваш пользователь хочет создать приложение, которое не ваше, которое использует вашу DLL. Пользователи могут писать полностью доверенный код, а полностью доверенный код имеет право подделывать доказательства . Вот что означает «полностью доверенный» . Таким образом, пользователь создает приложение, которое не было подписано вами, но поскольку пользователь может полностью доверять этому приложению, приложению, которому полностью доверяют, разрешено подделывать доказательства того, что код исходит от вас.
В этом отношении ничто не мешает пользователю просто взять ваш код, удалить вашу подпись и заменить ее своей подписью. Вы можете сказать, что ваше лицензионное соглашение запрещает это, и вы можете подать в суд на них, если узнаете, но вы не можете ничего сделать, чтобы остановить их.
И, черт возьми, пользователь может отключить ВСЮ систему безопасности, если хочет, и в этом случае все может работать.
Вам следует подумать, хотите ли вы вообще отправлять свою DLL клиентам. Если он содержит секреты, которые вы не хотите раскрывать, не делитесь этими секретами с тысячами клиентов, некоторые из которых могут быть враждебны к вам. Если вы храните свою DLL на своих собственных серверах и предоставляете свои услуги через Интернет, то вы никогда не отправите свою DLL клиентам, и поэтому они не смогут использовать ее на своих компьютерах в целях, отличных от ваших.