我即将开始研发针对内部客户的ClickOnce应用,以便在组织的内部网上使用。我想简化设置过程,所以我认为开发部分信任的应用程序是个好主意,但现在我不太确定。
用户特别要求的一件事是(归结为)带有Cue Text的TextBox
。目前提供此功能的最简单方法是使用一个简单的TextBox
子类,其中包含CueText功能作为属性。 cuetext功能是通过对SendMessage()
的PInvoke调用完成的。
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设置为“Included”而不是“Zone Default”时,我甚至不需要手动断言,一切都会发生。但当然,我认为客户仍然会得到提升提示。
是否有可能在部分信任环境中做我想做的事情?我开始怀疑它不是b / c它甚至没有意义。任意部分受信任的代码不应该只能调用SendMessage,对吧?我开始意识到我一直试图规避安全措施而不是在其中工作。
如果是这种情况,是否值得努力开发此应用程序并将部分信任作为优先事项?或者,我是否应该在设置时将自己重新设置为高程提示,以便为计划和满足ui要求创建完全受信任的应用程序?
答案 0 :(得分:5)
如果您正在部署Intranet应用程序,我绝对不认为混淆部分信任方案是值得的。部分信任往往难以理解,并且可能会对代码施加非明显的限制。我只在必须将组件部署到现有的部分信任环境时使用它。
在不需要它的场景中设置新的部分信任环境只会为自己增加额外的开销。除非有特定的客户要求,内联网应用程序的可能性较小,否则我会避免使用它。
答案 1 :(得分:1)
声明
permission.Assert();
只能授予程序集可用的线程权限。这就是为什么不起作用。
所以:是的,您需要在程序集级别包含这些权限。就像JaredPar所说,你也可以使用完全信任。