Стоит ли делать частичное доверие моего приложения clickonce? - PullRequest
2 голосов
/ 02 октября 2009

Я собираюсь начать работу над приложением ClickOnce, предназначенным для внутренних клиентов, для использования во внутренней сети организации. Я хочу упростить процесс установки, поэтому я подумал, что разработка приложения с частичным доверием будет хорошей идеей, но теперь я не уверен.

Одна вещь, которую пользователи специально просили, это (сводится к) TextBox с Cue Text. Самый простой способ обеспечить это на данный момент - это простой подкласс TextBox, который включает в себя функциональность CueText в качестве свойства. Функциональность Cuetext осуществляется с помощью вызова PInvoke'd для SendMessage().

protected override void OnHandleCreated(EventArgs e)
{
    this.UpdateCueText();  // Bang, you're dead here
    base.OnHandleCreated(e);
}

private void UpdateCueText()
{
    if (this.IsHandleCreated)
    {
        NativeMethods.SendMessage(new HandleRef(this, this.Handle), setCueBannerMessage, this.showCueTextWithFocus ? new IntPtr(1) : IntPtr.Zero, this.cueText);
    }
}

"Ах-ха! Мне нужно SecurityPermission.UnmanagedCode." Насколько я могу судить, безопасность зоны интрасети по умолчанию включает в себя разрешение SecurityPermission, поэтому я пытаюсь запустить его и оно взорвется при вызове UpdateCueText(). Я даже могу проверять свойства SecurityException b / c, при каждой попытке оценить свойство SecurityException выбрасывается еще одно невидимое SecurityException.

Пробую стандартную модификацию:

protected override void OnHandleCreated(EventArgs e)
{
    var permission = new SecurityPermission(SecurityPermissionFlag.UnmanagedCode);
    permission.Assert();
    try
    {
        this.UpdateCue();
    }
    finally
    {
        CodeAccessPermission.RevertAssert();
    }
    base.OnHandleCreated(e);
}

Все еще не повезло. Но когда я захожу на страницу настроек безопасности в свойствах проекта и устанавливаю для параметра SecurityPermission значение «Включено» вместо «Зона по умолчанию», мне даже не требуется ручное утверждение, все просто происходит. Но, конечно, тогда я предполагаю, что клиент все еще получит запрос на повышение прав.

Можно ли сделать то, что я пытаюсь сделать, из среды частичного доверия? Я начинаю подозревать, что это не б / к, это даже не имело бы смысла. Произвольный частично доверенный код не может быть в состоянии просто вызвать SendMessage, верно? Я начинаю понимать, что я пытаюсь обойти меры безопасности вместо того, чтобы работать внутри них.

Если это так, стоит ли даже усилий разработать это приложение с частичным доверием в качестве приоритета? Или я должен просто смириться с запросом на повышение прав при настройке, чтобы создать полностью доверенное приложение во имя графика и удовлетворения требований пользовательского интерфейса?

Ответы [ 2 ]

5 голосов
/ 02 октября 2009

Если вы развертываете приложение для интрасети, я определенно не думаю, что стоит вмешиваться в сценарии частичного доверия. Частичное доверие трудно понять и может накладывать неочевидные ограничения на ваш код. Я использую его только тогда, когда мне нужно развернуть компонент в существующей среде частичного доверия.

Настройка новой среды частичного доверия в сценарии, который не требует ее, просто добавляет дополнительные издержки для себя. Если бы не было конкретного требования клиента, менее вероятного для интранет-приложения, я бы его избежал.

1 голос
/ 02 октября 2009

Заявление

permission.Assert();

может предоставлять только те разрешения потоков, которые уже доступны для сборки. Вот почему это не работает.

Итак: Да, вам нужно будет включить эти разрешения на уровне сборки. И, как говорит JaredPar, вы можете также использовать полное доверие.

...