2

組織のイントラネットで使用する内部顧客向けの ClickOnce アプリの作成を開始しようとしています。セットアップ プロセスを簡単にしたいので、アプリを部分的に信頼できるように開発するのは良い考えだと思いましたが、今はよくわかりません。

ユーザーが具体的に要求したことの 1 つは、(要約すると) TextBoxCue Text を使用することです。現時点でこれを提供する最も簡単な方法はTextBox、プロパティとして CueText 機能を含む の単純なサブクラスを使用することです。キューテキスト機能は、への PInvoke 呼び出しを介して行われ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プロパティを評価しようとすると、SecurityException別の uninspectable がスローされるたびに、b/c のプロパティを検査することもできます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 を "Zone Default" ではなく "Included" に設定すると、手動のアサーションさえ必要なく、すべてが発生します。しかしもちろん、顧客は引き続き昇格のプロンプトを受け取ると思います。

私がやろうとしていることを部分信頼環境から行うことは可能ですか? 私はそれが b/c ではなく、意味をなさないのではないかと疑い始めています。任意の部分的に信頼されたコードは、SendMessage を呼び出すことはできませんよね? セキュリティ対策の範囲内で作業するのではなく、セキュリティ対策を回避しようとしてきたことに気づき始めています。

その場合、部分的な信頼を優先してこのアプリを開発する価値はありますか? それとも、スケジュールと UI 要件を満たすために、完全に信頼できるアプリを作成するために、セットアップ時に昇格プロンプトに辞任する必要がありますか?

4

2 に答える 2

5

イントラネット アプリケーションを展開している場合、部分的な信頼のシナリオを台無しにする価値はまったくないと思います。部分的な信頼は理解しにくい傾向があり、コードに明白でない制限を課す可能性があります。コンポーネントを既存の部分信頼環境にデプロイする必要がある場合にのみ使用します。

それを必要としないシナリオで新しい部分信頼環境をセットアップすることは、自分自身に余分なオーバーヘッドを追加するだけです。イントラネット アプリの可能性が低い、特定の顧客要件がない限り、私はそれを避けます。

于 2009-10-02T17:44:43.250 に答える
1

ステートメント

permission.Assert();

アセンブリで既に使用可能なスレッド アクセス許可のみを付与できます。それがうまくいかない理由です。

そう: はい、アセンブリ レベルでこれらのアクセス許可を含める必要があります。JaredPar が言うように、完全な信頼を使用することもできます。

于 2009-10-02T18:08:56.403 に答える