2012-06-29 7 views
8

Possiedo un'applicazione Silverlight 5.1.10411.0 Out-of-Browser che è NOT trusted e sto tentando di chiudere l'applicazione utilizzando il metodo App.Current.MainWindow.Close. Secondo la documentazione posso solo usare questo meccanismo se una di queste condizioni:L'applicazione Silverlight Out-of-Browser non si chiude utilizzando il metodo MainWindow.Close

  • Si tratta di un'applicazione di fiducia (non è vero per la mia applicazione)
  • Prima dell'evento Application.Startup ha completato (non è vero per la mia applicazione)
  • in risposta ad un'azione avviata dall'utente, ad esempio, in un gestore di pulsante evento Click (questo è quello che sto cercando di andare al lavoro)

nei miei tentativi di ottenere questo a lavoro Ho mantenuto le cose estremamente semplici e sto chiamando direttamente il metodo un codice dietro il gestore di eventi click del pulsante come mostrato sotto ma non ha alcun effetto.

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

Quando ho connettere il debugger e impostare "Break quando viene generata un'eccezione" Posso vedere l'eccezione

SecurityException: L'accesso alla chiamata proprietà o metodo non è ammissibile a meno che l'applicazione ha autorizzazioni elevate o il codice è stato richiamato tramite un'azione avviata dall'utente.

Qualche motivo per cui il mio codice non viene considerato un'azione avviata dall'utente?

Ho provato allegando il gestore eventi sia XAML e nel codice-dietro (non allo stesso tempo)

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

o

closeButton.Click += closeButton_Click; 

senza successo. Ho letto la documentazione User-Initiated Events con molta attenzione e non vedo perché il mio codice non è considerato avviato dall'utente. Ho provato questo in entrambe le modalità di debug e di rilascio, nonché quando nessun debugger è collegato senza successo. Se cambio "Richiedi affidabilità elevata quando si esegue all'esterno del browser" per essere vero, la chiamata vicina funziona come previsto.

ho ridefinito le mie esigenze applicative Per ovviare a questo problema, ma mi piacerebbe davvero capire che cosa sto facendo male ;-)

Aggiornamento: SonOfPirate 's risposta indicare che la documentazione relativa a questo il metodo non è preciso ma non ne sono convinto. Utilizzando lo strumento riflessione dotPeek il metodo che sta gettando l'eccezione è

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

Ho trovato questo un po 'di confusione per leggere così ho deriso il codice e scritto unit test per esso, come mostrato da questo gist e, come si può dai risultati dovrei essere in grado di chiamare da vicino un'applicazione non affidabile, a condizione che sia avviata dall'utente. Window Close Security Test Results

L'eccezione di protezione messaggio

accesso alla chiamata proprietà o metodo non è consentito a meno che l'applicazione ha elevato le autorizzazioni, oppure il codice è stato chiamato attraverso un'azione dell'utente iniziati.

indica anche che dovrebbe essere possibile così sono tornato alla domanda: perché questo codice non è considerato avviato dall'utente?

+0

Hai diverse finestre? – jv42

+0

No, solo la singola MainWindow. –

+0

Hai provato a utilizzare il comando del pulsante? Non dovrebbe cambiare nulla però. – jv42

risposta

3

L'errore è nel primo paragrafo quando si afferma che "è possibile utilizzare questo meccanismo solo se una di queste condizioni è vera:" rileggere la documentazione MS un po 'più vicino e si vedrà che non dicono "uno" di queste condizioni. Ecco il testo esatto dalla pagina di riferimento MS per la Close method:

È possibile chiamare questo metodo solo nei seguenti casi:

  • In risposta ad un'azione avviata dall'utente, ad esempio, in un pulsante Fare clic sul gestore di eventi.
  • Prima che l'evento Application.Startup sia stato completato (vale a dire, in un metodo IApplicationService.StartService, un metodo IApplicationLifetimeAware.Starting o un gestore eventi di avvio).
  • In un'applicazione attendibile.

Come si è visto, è necessario abilitare la fiducia elevata.

UPDATE

ammetto che la formulazione usata da Microsoft è un po 'fuorviante con uno dei primi due casi il termine in combinazione con il terzo. Forse sarebbe più chiaro se formulato in modo più accurato come:

È possibile chiamare questo metodo solo in un'applicazione attendibile in uno dei seguenti casi:

  • In risposta ad un'azione avviata dall'utente, per esempio, in un pulsante Fai clic su gestore di eventi.
  • Prima che l'evento Application.Startup sia stato completato (vale a dire, in un metodo IApplicationService.StartService , un metodo IApplicationLifetimeAware.Starting o un gestore eventi di avvio).
+0

Avevo già considerato che tutti i casi dovevano essere veri piuttosto che uno di essi, ma questo significherebbe che puoi chiamare il metodo "Prima che l'evento Application.Startup sia completato". Questo non è il caso ed è possibile chiamare il metodo in un'applicazione attendibile dopo l'evento Avvio. Se si utilizza uno strumento di riflessione per esaminare il metodo Window.Close, è possibile vedere la chiamata a "this.CheckForPermissions();" e l'implementazione solleva l'eccezione solo se non è attendibile e non è avviata dall'utente e l'applicazione è stata avviata –

+0

Vedere gli aggiornamenti alla mia risposta originale – SonOfPirate

+0

Penso che probabilmente hai ragione anche se userei un linguaggio più forte di "un po 'fuorviante ", per lo meno vorrei cadere il _bit_ :-) –

0

Come elevare il permesso per il controllo WebBrowser in Silverlight:

1- http://msdn.microsoft.com/en-us/library/gg192793%28v=vs.96%29.aspx Topic:Per attivare in-browser di fiducia applicazioni

2- http://www.johnpapa.net/digitally-signing-a-xap-silverlight/ Argomento:Digitally La firma di un XAP Silverlight

3- http://chainding.wordpress.com/2012/09/19/silverlight-5-trusted-applications/ Topic:Aggiunta l'impostazione Firma il file XAP registro richiesto Distribuzione del certificato di

E assicurarsi che il certificato firmato viene distribuito in Editore affidabile del computer locale e dell'utente corrente.

Problemi correlati