Niedawno zaktualizowałem pakiet SDK do Azure 2.1, a teraz napotykam problem z częścią mojego web.config
w roli internetowej podczas działania na emulatorze obliczeniowym. Moja web.config
zawiera to:Dlaczego konfiguracja unlock appcmd.exe nie działa na emulatorze Azure?
<location path="api">
<system.webServer>
<security>
<access sslFlags="Ssl, SslRequireCert, SslNegotiateCert" />
</security>
</system.webServer>
<system.web>
<authorization>
<allow users="*" />
</authorization>
</system.web>
</location>
muszę tego powodu wszystko w ścieżce /api/
wymaga uwierzytelnienia klientów poprzez dostarczanie certyfikatów po stronie klienta za pośrednictwem protokołu HTTPS.
Domyślnie usługi IIS są skonfigurowane tak, aby nie zezwalać na to - element <access>
pod system.webServer/security
jest domyślnie zablokowany. Tak więc zawsze miałem zadanie uruchamiania, które zawiera:
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
Bez tego pojawi się błąd 500.19. Do niedawna to zadanie początkowe zawsze skutecznie zapobiegało temu błędowi, umożliwiając działanie konfiguracji SSL.
Ale to już nie działa i, o ile mogę to powiedzieć, stało się, gdy przełączyłem się na 2.1 SDK. Wszystko inne w tej roli sieciowej działa po drodze - tylko wtedy, gdy próbuję uzyskać dostęp do usług pod ścieżką /api/
, do której mają zastosowanie ustawienia konfiguracji SSL, pojawia się błąd. I to jest 500,19. (500 to "wewnętrzny błąd serwera", ale .19 oznacza, że jest to błąd konfiguracji.)
O ile wiem, dzieje się tak, ponieważ próba odblokowania tej sekcji konfiguracji już nie działa. Powodem dla którego mówię, jest to, że jeśli znajdę plik applicationHost.config
, który utworzy emulator Azure (w C:\Users\<user>\AppData\Local\dftmp\Resources\<some random guid>\temp\temp\RoleTemp
) i ręcznie go edytuję, zastępując Deny
dla elementu security
za pomocą Allow
, przestanę otrzymywać błąd i mogę z powodzeniem użyć usługi wymagające certyfikatów klienta.
Oczywiście nie ma to znaczenia - ta applicationHost.config
jest ponownie generowana za każdym razem, gdy uruchamiasz aplikację w emulatorze (i za każdym razem zmienia się dokładna lokalizacja). Potrzebuję jakiś sposób, aby niezawodnie odblokować tę sekcję konfiguracji automatycznie za każdym razem, gdy debuguję aplikację lokalnie. To właśnie ma robić appcmd.exe
, ale wydaje się, że przestało działać.
Zdarzyło mi się, że problem może polegać na tym, że pobiera on wersję IIS appcmd.exe
, mimo że pakiet Azure SDK używa teraz ekspresu IIS. Nie jestem pewien, czy są one różne programy, więc próbowałem to dodanie na końcu mojego polecenia uruchamiania:
"%ProgramFiles%\IIS Express\appcmd.exe" unlock config /section:system.webServer/security/access
To wyraźnie prowadzi kopię IIS Express. Ale to nie robi żadnej różnicy.
Zadanie uruchomienia zdecydowanie działa, zanim ktokolwiek zapyta. W tym samym folderze co applicationHost.config
widzę plik WaHostBootstrapper.log
i zawiera (między innymi) te wiersze:
[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
Oznacza to, że mój EnableClientCerts.cmd
(skrypt, który wywołuje appcmd.exe
) prowadził bez błędów.
Nie do końca wiadomo, w jaki sposób appcmd.exe
wie, która konkretna strona internetowa ma być konfigurowana. Jest ich kilka - mam odpowiednie usługi IIS w tym polu, a także skonfigurowano witrynę usługi IIS Express niezwiązaną z usługą Azure. Czy to możliwe, że nie skonfigurował poprawnego celu?
Również widzę kilka tego rodzaju błędów w WaHostBootstrapper.log
:
[00025156:00018324, 2013/08/30, 22:15:03.033, ERROR] <- WapGetEnvironmentVariable=0x800700cb
Czy to może być związane?
Czy brakuje czegoś z mojego skryptu do odblokowania sekcji konfiguracji?
Czy wiesz, czy zmienna istnieje również w chmurze, czy tylko w emulatorze? – Vertigo
Wygląda na to, że znajduje się w chmurze - ten skrypt działa zarówno w emulatorze, jak iw chmurze. Ale dotyczy mnie, ponieważ nie jest to udokumentowane. –
Skończyło się na tym "warunku wstępnym": JEŚLI NIE ZDEFINIOWANO APPCMD ZESTAW APPCMD =% SystemRoot% \ system32 \ inetsrv \ AppCmd.exe – Vertigo