2013-08-30 17 views
7

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?

Odpowiedz

7

Okazuje się, że kiedy emulator uruchamia zadanie startowe, ustawił już zmienną APPCMD. Ponadto określa ona nie tylko odnieść się do AppCmd.exe, to zawiera również przełącznik wiersza polecenia, które wskazuje na prawo pliku konfiguracyjnym:

"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"

Więc jeśli skrypt startowy tylko wykorzystuje %APPCMD% bez najpierw próbuje ustawić to będzie dotyczyło poprawnej instancji. Mój skrypt nie działał, ponieważ podjął własną decyzję dotyczącą lokalizacji AppCmd.exe i zakończyłby modyfikację ustawień globalnych dla usług IIS lub IIS Express, z których żaden nie ma żadnego wpływu na instancję usług IIS hostowanych przez emulator platformy Azure. (Zgaduję, że jest to ostatnia zmiana w zachowaniu, prawdopodobnie związana z nową funkcją w Azure SDK 2.1, która pozwala na niewysłużone rozwijanie).

Najbardziej martwi mnie to, że nie mogę znaleźć dowolna dokumentacja opisująca tę predefiniowaną zmienną APPCMD. I tylko odkrył go poprzez dodanie następujących do mojego skryptu uruchamiania komend:

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

I dodał, że czasowo i prowadził rolę internetowej, i to pod warunkiem, kompletny zrzut wszystkich zmiennych środowiskowych. Przeglądając tę ​​listę, zmienna APPCMD jest jedyną, która zawiera informacje wymagane do kierowania na prawidłową konfigurację. Ale wydaje się, że dokumentacja dla zadań startowych sugeruje bezpośrednio na kopię IIS z AppCmd.exe - artykuł po prostu koduje ścieżkę. Myślę, że to działałoby, gdybym włączyła pełne emulatory IIS, ale tak naprawdę nie chcę tego robić.

Chociaż to rozwiązanie działa (i wydaje się być jedynym realnym rozwiązaniem, biorąc pod uwagę to, co jest w środowisku uruchamiania), denerwuje mnie to, ponieważ jest to nieudokumentowana funkcja. Bądź więc ostrożny, jeśli natknąłeś się na tę odpowiedź - może nie być ona wiarygodna.

+0

Czy wiesz, czy zmienna istnieje również w chmurze, czy tylko w emulatorze? – Vertigo

+0

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. –

+4

Skończyło się na tym "warunku wstępnym": JEŚLI NIE ZDEFINIOWANO APPCMD ZESTAW APPCMD =% SystemRoot% \ system32 \ inetsrv \ AppCmd.exe – Vertigo

Powiązane problemy