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?
Sai se la variabile esiste anche nel cloud o solo nell'emulatore? – Vertigo
Sembra che ci sia nel cloud: questo script funziona sia nell'emulatore che nel cloud. Ma mi riguarda perché non è documentato. –
Ho finito con questa "precondizione": IF NOT DEFINED APPCMD SET APPCMD =% SystemRoot% \ system32 \ inetsrv \ AppCmd.exe – Vertigo