【发布时间】:2009-10-02 17:41:05
【问题描述】:
我即将开始开发针对内部客户的 ClickOnce 应用程序,以便在组织的 Intranet 上使用。我想简化设置过程,所以我认为将应用程序开发为部分受信任是一个好主意,但现在我不太确定。
用户特别要求的一件事是(归结为)带有提示文本的TextBox。目前提供此功能的最简单方法是使用 TextBox 的简单子类,其中包含 CueText 功能作为属性。 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。”据我所知,默认的 Intranet 区域安全包括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设置为“包含”而不是“区域默认”时,我什至不需要手动断言,一切都会发生。但当然,我假设客户仍然会收到海拔提示。
是否有可能在部分信任的环境中做我想做的事情?我开始怀疑这不是 b/c,它甚至没有意义。任意部分受信任的代码不应该只调用 SendMessage,对吗?我开始意识到我一直在试图规避安全措施,而不是在其中工作。
如果是这样的话,是否值得努力以部分信任为优先开发这个应用程序?还是我应该在设置时接受提升提示以创建一个完全受信任的应用程序,以便安排时间并满足用户界面要求?
【问题讨论】:
标签: c# clickonce pinvoke code-access-security