2013-08-30 5 views
7

Ho recentemente aggiornato l'SDK di Azure 2.1 e ora sto riscontrando un problema con parte del mio web.config in un ruolo Web quando si esegue l'emulatore di elaborazione. Il mio web.config contiene questo:Perché la configurazione di sblocco di appcmd.exe non funziona sull'emulatore di Azure?

<location path="api"> 
    <system.webServer> 
    <security> 
     <access sslFlags="Ssl, SslRequireCert, SslNegotiateCert" /> 
    </security> 
    </system.webServer> 
    <system.web> 
    <authorization> 
     <allow users="*" /> 
    </authorization> 
    </system.web> 
</location> 

ho bisogno di questo perché tutto sotto il percorso /api/ richiede ai client di autenticarsi fornendo certificati lato client tramite HTTPS.

Per impostazione predefinita, IIS è configurato per non consentire di eseguire questa operazione: l'elemento <access> sotto system.webServer/security è bloccato per impostazione predefinita. Quindi ho sempre avuto un'attività di avvio che contiene questo:

SET APPCMD=%windir%\system32\inetsrv\appcmd.exe 
IF EXIST APPCMD GOTO :INUSUALPLACE 
SET APPCMD="%ProgramFiles%\IIS Express\appcmd.exe" 
:INUSUALPLACE 
%APPCMD% unlock config /section:system.webServer/security/access 

In caso contrario, si otterrebbe un errore 500.19. Fino a poco tempo fa, questa attività di avvio ha sempre evitato questo errore, abilitando la mia configurazione SSL a funzionare.

Ma non funziona più e, per quanto posso dire, è successo quando sono passato all'SDK 2.1. Tutto il resto in questo ruolo Web funziona a proposito - è solo quando provo ad accedere ai servizi nel percorso /api/ a cui si applicano le impostazioni di configurazione SSL che ottengo un errore. Ed è un 500.19. (Il 500 è "errore interno del server", ovviamente, ma il .19 indica che si tratta di un errore di configurazione.)

Per quanto posso dire, sta accadendo perché il tentativo di sbloccare questa sezione di configurazione non funziona più. La ragione per cui dico che se trovo il file applicationHost.config creato dall'emulatore di Azure (in C:\Users\<user>\AppData\Local\dftmp\Resources\<some random guid>\temp\temp\RoleTemp) e lo modifico manualmente, sostituendo lo Deny per l'elemento security con uno Allow, non riesco a ottenere l'errore e posso utilizzare correttamente il servizi che richiedono certificati client.

Questo è inutile per risolvere il problema, naturalmente - questo applicationHost.config si rigenera ogni volta che si esegue l'applicazione nell'emulatore (e la posizione esatta cambia ogni volta). Ho bisogno di un modo per sbloccare in modo affidabile questa sezione di configurazione automaticamente ogni volta che eseguo il debug dell'applicazione localmente. Questo è ciò che dovrebbe fare appcmd.exe, ma sembra aver smesso di funzionare.

Mi è venuto in mente che il problema potrebbe essere che sta rilevando la versione IIS di appcmd.exe, anche se ora l'SDK di Azure utilizza IIS Express. Non sono sicuro se sono programmi diversi, così ho provato ad aggiungere questo alla fine del mio comando di avvio:

"%ProgramFiles%\IIS Express\appcmd.exe" unlock config /section:system.webServer/security/access 

Questo viene eseguito in modo esplicito la copia di IIS Express. Ma non sembra fare alcuna differenza.

L'attività di avvio è sicuramente in esecuzione, prima che qualcuno chieda. Nella stessa cartella del applicationHost.config, vedo un file WaHostBootstrapper.log, e contiene (tra le altre cose) queste righe:

[00025156:00018324, 2013/08/30, 22:15:03.033, INFO ] Executing Startup Task type=0 rolemodule=(null) cmd="c:\dev\mm\DevInt\src\Mm.Cloud\csx\Debug\roles\Mm.Web\approot\bin\Startup\EnableClientCerts.cmd" 
[00025156:00018324, 2013/08/30, 22:15:03.034, INFO ] Executing "c:\dev\mm\DevInt\src\Mm.Cloud\csx\Debug\roles\Mm.Web\approot\bin\Startup\EnableClientCerts.cmd" . 
[00025156:00018324, 2013/08/30, 22:15:03.221, INFO ] Program "c:\dev\mm\DevInt\src\Mm.Cloud\csx\Debug\roles\Mm.Web\approot\bin\Startup\EnableClientCerts.cmd" exited with 0. Working Directory = c:\dev\mm\DevInt\src\Mm.Cloud\csx\Debug\roles\Mm.Web\approot\bin 

Questo indica che la mia EnableClientCerts.cmd (lo script che chiama appcmd.exe) ha funzionato senza errori.

Non sono del tutto chiaro su come appcmd.exe conosca quale particolare sito Web deve essere configurato. Ce ne sono diversi: ho IIS corretto su questa scatola e c'è anche un sito IIS Express non correlato ad Azure configurato. È possibile che non riesca a configurare il target corretto?

Inoltre, vedo un paio di questo tipo di errore nel WaHostBootstrapper.log:

[00025156:00018324, 2013/08/30, 22:15:03.033, ERROR] <- WapGetEnvironmentVariable=0x800700cb 

Che potrebbe essere correlato?

C'è qualcosa che manca dal mio script per sbloccare la sezione di configurazione?

risposta

7

Si scopre che quando l'emulatore avvia l'attività di avvio, ha già impostato la variabile APPCMD. Inoltre, pone non solo per riferirsi al AppCmd.exe, include anche una riga di comando che punta al file di configurazione destra:

"C:\Program Files\IIS Express\appcmd.exe" /apphostconfig:"C:\Users\Ian\AppData\Local\dftmp\Resources\1217ef49-a59a-4e18-8ebc-27d06a78cbd5\temp\temp\RoleTemp\applicationHost.config"

Quindi, se lo script di avvio utilizza solo %APPCMD% senza prima tentare di impostare esso, si applicherà all'istanza corretta. Il mio script non funzionava perché ha deciso autonomamente dove si trovava AppCmd.exe e finirebbe con la modifica delle impostazioni globali per IIS o IIS Express, nessuno dei quali sembra avere alcun impatto sull'istanza di IIS che ospita Azure Emulator. (Sto indovinando che si tratta di un recente cambiamento di comportamento, probabilmente relativo alla nuova funzionalità di Azure SDK 2.1 che consente lo sviluppo non elevato.)

La cosa che mi preoccupa di questo è che non riesco a trovare qualsiasi documentazione che menziona questa variabile predefinita APPCMD. Ho scoperto solo aggiungendo il seguente al mio script comando di avvio:

%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe "gci env: | format-list" > c:\temp\env.log 

Ho aggiunto che temporaneamente e corse il ruolo web, ed è fornito un dump completo di tutte le variabili d'ambiente. Guardando attraverso tale elenco, la variabile APPCMD è l'unica che contiene le informazioni richieste per indirizzare la configurazione corretta. Ma la documentazione per le attività di avvio sembra raccomandare di puntare direttamente alla copia di IIS di AppCmd.exe - l'articolo Use AppCmd.exe to Configure IIS at Startup solo hardcodes il percorso. Immagino che funzionerebbe se avessi abilitato l'uso di IIS completo nell'emulatore, ma in realtà non voglio farlo.

Quindi, anche se questa soluzione funziona (e sembra essere l'unica soluzione praticabile, dato ciò che è nell'ambiente dell'attività di avvio) mi rende nervoso perché è una funzionalità non documentata. Quindi fai attenzione se sei incappato in questa risposta - potrebbe non essere affidabile.

+0

Sai se la variabile esiste anche nel cloud o solo nell'emulatore? – Vertigo

+0

Sembra che ci sia nel cloud: questo script funziona sia nell'emulatore che nel cloud. Ma mi riguarda perché non è documentato. –

+4

Ho finito con questa "precondizione": IF NOT DEFINED APPCMD SET APPCMD =% SystemRoot% \ system32 \ inetsrv \ AppCmd.exe – Vertigo

Problemi correlati