8

我有一个不受信任的 Silverlight 5.1.10411.0 Out-of-Browser应用程序,我正在尝试使用App.Current.MainWindow.Close方法关闭该应用程序。根据文档,如果以下条件之一为真,我只能使用此机制:

  • 这是一个受信任的应用程序(我的应用程序不是这样)
  • 在 Application.Startup 事件完成之前(我的应用程序不是这样)
  • 响应用户发起的操作,例如,在按钮 Click 事件处理程序中(这就是我要开始工作的内容)

在我试图让它工作的过程中,我让事情变得非常简单,并直接在按钮单击事件处理程序后面的代码中调用该方法,如下所示,但它没有任何效果。

void closeButton_Click(object sender, RoutedEventArgs e)
{
    var mainWindow = Application.Current.MainWindow;
    mainWindow.Close();
}

当我附加调试器并设置“抛出异常时中断”时,我可以看到异常

SecurityException:除非应用程序具有提升的权限,或者代码是通过用户启动的操作调用的,否则不允许访问属性或方法调用。

任何想法为什么我的代码不被视为用户发起的操作?

我尝试在 XAML 和代码隐藏中附加事件处理程序(不是同时)

 <Button x:Name="closeButton" Content="Close" Click="closeButton_Click" />

或者

 closeButton.Click += closeButton_Click;

没有成功。我已经非常仔细地阅读了用户发起的事件文档,并且看不出为什么我的代码不被认为是用户发起的。我已经在调试和发布模式以及没有成功连接调试器的情况下尝试过这个。如果我将“在浏览器外运行时需要提升信任”更改为 true,则关闭调用将按预期工作。

我已经重新定义了我的应用程序要求来解决这个问题,但我真的很想了解我做错了什么;-)

更新SonOfPirate的回答表明此方法的文档不准确,但我不相信。使用反射工具dotPeek抛出异常的方法是

private void CheckForPermissions()
{
  if (!Application.Current.HasElevatedPermissions && !XcpImports.IsUserInitiatedAction() && Application.Current.ApplicationStarted)
    throw new SecurityException(Resx.GetString("Window_AccessNotAllowed"));
}

我觉得这读起来有点混乱,所以我已经模拟了代码并为它编写了单元测试,如此要点所示,正如你从结果中看到的那样,我应该能够从不受信任的应用程序调用 close,只要它是用户发起。 窗口关闭安全测试结果

安全异常消息

除非应用程序具有提升的权限,或者代码是通过用户启动的操作调用的,否则不允许访问属性或方法调用。

还表明它应该是可能的,所以我回到问题 - 为什么这段代码不被认为是用户启动的?

4

2 回答 2

3

The mistake is in the very first paragraph when you state that you "can only use this mechanism if one of these conditions is true:" Re-read the MS documentation a little closer and you will see that they do not say "one" of these conditions. Here is the exact text from the MS reference page for the Close method:

You can call this method only in the following cases:

  • In response to a user-initiated action, for example, in a button Click event handler.
  • Before the Application.Startup event has completed (that is, in an IApplicationService.StartService method, an IApplicationLifetimeAware.Starting method, or a Startup event handler).
  • In a trusted application.

As you have seen, you need to enable elevated trust.

UPDATE

I concede that the wording used by Microsoft is a bit misleading with either of the first two cases required in combination with the third. Perhaps it would be clearer if worded more accurately as:

You can call this method only in a trusted application in either of the following cases:

  • In response to a user-initiated action, for example, in a button Click event handler.
  • Before the Application.Startup event has completed (that is, in an IApplicationService.StartService method, an IApplicationLifetimeAware.Starting method, or a Startup event handler).
于 2012-07-04T13:24:34.653 回答
0

如何在 silverlight 中提升 webBrowser 控件的权限:

1- http://msdn.microsoft.com/en-us/library/gg192793%28v=vs.96%29.aspx 主题: 启用浏览器内受信任的应用程序

2- http://www.johnpapa.net/digitally-signing-a-xap-silverlight/ 主题: 对 XAP Silverlight 进行数字签名

3- http://chainding.wordpress.com/2012/09/19/silverlight-5-trusted-applications/ 主题: 添加所需的注册表设置 签署您的 XAP 文件 部署证书

并确保签名证书部署在本地机器和当前用户的受信任的发布者中。

于 2014-02-10T06:05:30.087 回答