8

信頼されていないSilverlight 5.1.10411.0 Out-of-Browserアプリケーションがあり、 App.Current.MainWindow.Closeメソッドを使用してアプリケーションを閉じようとしています。ドキュメントによると、次の条件のいずれかが true の場合にのみ、このメカニズムを使用できます。

  • 信頼できるアプリケーションです (私のアプリケーションには当てはまりません)
  • Application.Startup イベントが完了する前 (私のアプリケーションには当てはまりません)
  • ユーザーが開始したアクションに応答して、たとえば、ボタンのクリックイベントハンドラーで (これは私が作業しようとしているものです)

これを機能させるための私の試みでは、物事を非常に単純に保ち、以下に示すようにコードビハインドボタンクリックイベントハンドラーでメソッドを直接呼び出していますが、効果はありません.

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;

成功せずに。User-Initiated Eventsのドキュメントを注意深く読みましたが、コードがユーザーによって開始されたと見なされない理由がわかりません。デバッグ モードとリリース モードの両方でこれを試しましたが、デバッガーが接続されていない場合でも成功しませんでした。「ブラウザー外で実行する場合は昇格した信頼が必要」を 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

「これらの条件のいずれかが真である場合にのみ、このメカニズムを使用できる」と述べている最初の段落に誤りがあります。MS のドキュメントをもう少し詳しく読み直してください。これらの条件。Close メソッドの MS リファレンス ページからの正確なテキストは次のとおりです。

このメソッドは、次の場合にのみ呼び出すことができます。

  • ユーザーが開始したアクション (ボタンの Click イベント ハンドラーなど) への応答。
  • Application.Startup イベントが完了する前 (つまり、IApplicationService.StartService メソッド、IApplicationLifetimeAware.Starting メソッド、または Startup イベント ハンドラー内)。
  • 信頼できるアプリケーションで。

これまで見てきたように、昇格された信頼を有効にする必要があります。

アップデート

Microsoft が使用する文言は、最初の 2 つのケースのいずれかと 3 番目のケースの組み合わせで少し誤解を招くものであることを認めます。より正確に次のように表現すると、おそらくより明確になります。

このメソッドは、次のいずれかの場合に信頼できるアプリケーションでのみ呼び出すことができます。

  • ユーザーが開始したアクション (ボタンの Click イベント ハンドラーなど) への応答。
  • Application.Startup イベントが完了する前 (つまり、IApplicationService.StartService メソッド、IApplicationLifetimeAware.Starting メソッド、または Startup イベント ハンドラー内)。
于 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 に答える