Udostępnij za pośrednictwem


Rozwiązywanie typowych problemów związanych z uprawnieniami i zabezpieczeniami w ASP.NET

W tym artykule przedstawiono sposób rozwiązywania typowych problemów związanych z uprawnieniami i zabezpieczeniami w ASP.NET.

Oryginalna wersja produktu: ASP.NET
Oryginalny numer KB: 910449

Przydatne narzędzia

Przed podjęciem próby naprawienia uszkodzonego elementu należy zapoznać się z kilkoma narzędziami, które pomogą Ci zawęzić problem. W naszym przypadku będziemy zainteresowani narzędziami, takimi jak FileMon, RegMon i Security Auditing. Aby uzyskać więcej informacji na temat pliku FileMon, zobacz FileMon for Windows v7.04.

Aby uzyskać więcej informacji na temat RegMon, zobacz Sysinternals Windows.

Przechodzenie do szczegółów w celu wyizolowania problemu

  • Czy aplikacja kiedykolwiek działała? Jeśli tak, to co zmieniło się, co mogło spowodować przerwanie aplikacji? Istnieje możliwość zastosowania aktualizacji oprogramowania lub aktualizacji zabezpieczeń na serwerze. Wdrożenie kodu mogło również spowodować problem.
  • Proste strony .html i .asp są obsługiwane przez IIS?
  • Czy aplikacja została zmigrowana do innej wersji usług IIS?
  • Czy inne aplikacje ASP.NET na serwerze kończą się niepowodzeniem z powodu tego samego błędu? Czy jest to jedyna aplikacja, która kończy się niepowodzeniem?
  • Czy problem występuje dla wszystkich użytkowników, czy tylko dla konkretnych użytkowników?
  • Czy problem jest powtarzalny podczas przeglądania lokalnie na serwerze internetowym, czy jest powtarzalny tylko dla kilku klientów?
  • Jeśli używasz personifikacji, czy personifikowany użytkownik ma niezbędny dostęp do zasobu?

Powyższe pytania są przydatne w celu zdiagnozowania problemu. Jeśli publikujesz swój problem na dowolnym z forów ASP.NET i masz już odpowiedzi na większość z tych pytań, prawdopodobnie uzyskasz szybką wskazówkę lub rozwiązanie swojego problemu. Najważniejsze jest opublikowanie całego błędu śledzenia stosu ASP.NET, jeśli ma to zastosowanie, zamiast tylko powiedzieć: „Otrzymuję komunikat o błędzie odmowy dostępu podczas próby uruchomienia mojej aplikacji ASP.NET.” Czy ktoś może pomóc? Łatwiej jest komuś przeanalizować ślad stosu i podać wskazówki, gdy mogą zobaczyć pełny komunikat o błędzie. Więc musisz zadać sobie pytanie...

Jaki jest dokładny komunikat o błędzie?

Pierwsze pytanie, które zadajemy klientom, brzmi: "Jaki jest dokładny komunikat o błędzie?" Jeśli masz jasny opis komunikatu o błędzie zgłaszanego przez program Microsoft .NET Framework, możesz pominąć tę sekcję. Jeśli aplikacja maskuje rzeczywisty komunikat o błędzie i wyświetla przyjazny komunikat o błędzie, taki jak "Wystąpił nieoczekiwany błąd. Skontaktuj się z administratorem witryny sieci Web, aby uzyskać szczegółowe informacje" — nie jest to bardzo ważne dla nikogo. Poniżej przedstawiono kilka kroków, które pomogą Ci uzyskać rzeczywisty komunikat o błędzie.

  • Znajdź i otwórz plik Web.config w katalogu aplikacji i zmień wartość customErrors na mode="Off". Zapisz plik i odtwórz problem.

  • Nadal może nie być możliwe wyświetlenie rzeczywistego komunikatu o błędzie po wykonaniu powyższego kroku z powodu niestandardowej obsługi zdarzeń/błędów przez dewelopera aplikacji. Możesz spróbować zlokalizować zdarzenie Application_Error w pliku Global.asax i oznaczyć jako komentarz dowolny kod, który używa Server.Transfer("Errors.aspx") funkcji do przejścia do niestandardowej strony błędu.

    //Global.asax 
    void Application_Error(object sender, EventArgs e) 
    { 
        // Code that runs when an unhandled error occurs 
        //Server.Transfer("Errors.aspx"); 
    }
    

Po otrzymaniu rzeczywistego komunikatu o błędzie przeczytaj go, aby ustalić, czy błąd jest spowodowany brakiem uprawnień do zasobu lokalnego lub zasobu zdalnego, do którego aplikacja ASP.NET próbuje uzyskać dostęp.

Wskazówka

Możesz skontaktować się z deweloperem, aby dowiedzieć się, jak zobaczyć rzeczywisty komunikat o błędzie. Jest możliwe, że deweloper rejestruje to w pliku lub otrzymuje powiadomienia e-mail. Zawsze pamiętaj, aby utworzyć kopię zapasową dowolnego pliku, który chcesz zmienić. Dzięki dostępnej kopii zapasowej zawsze można wycofać wszelkie zmiany.

Problem występuje z powodu braku uprawnień do zasobu lokalnego, do którego aplikacja ASP.NET próbuje uzyskać dostęp

Jeśli nie możesz uzyskać jasnego opisu problemu z powodu niestandardowego komunikatu o błędzie, uruchom plik FileMon i odtwórz problem. Zatrzymaj i zapisz przechwytywanie jako FileMon.xls i otwórz plik w programie Microsoft Excel. W menu Dane wybierz pozycję Filtr, a następnie wybierz pozycję Autofiltr , aby użyć funkcji filtrowania programu Excel. Teraz wybierz listę rozwijaną w kolumnie F i poszukaj błędów "ODMOWA DOSTĘPU".

Poniżej przedstawiono przykładowe dane wyjściowe FileMon.

10381 1:01:11 PM w3wp.exe:2320 OPEN C:\winnt\microsoft.net\framework\v1.1.4322\Temporary ASP.NET Files\sessiontest\8832e585\275ec327\global.asax.xml 
ACCESS DENIED NT 
AUTHORITY\NETWORK SERVICE

Jak widać w filtrowanych wynikach, zawęziliśmy przyczynę problemu. FileMon pokazuje, że konto NT AUTHORITY\NETWORK SERVICE nie ma uprawnień NTFS w folderze C:\Winnt\Microsoft.net\Framework\v1.1.4322\Temporary ASP.NET Files . Powinno być łatwe do naprawienia.

Wskazówka

Dobrym krokiem jest zmiana konta procesu ASP.NET na konto administratora, aby sprawdzić, czy rozwiązuje problem. W IIS 6.0 i nowszych wersjach można zmienić tożsamość puli aplikacji IIS na "System lokalny", aby sprawdzić, czy aplikacja działa.

Uwaga

Nie powinno być używane jako rozwiązanie, ale tylko jako krok rozwiązywania problemów.

Większość osób zwykle ponownie zainstaluje program Microsoft .NET Framework, a nawet przejdzie do zakresu ponownego zainstalowania systemu operacyjnego. Nie jest to zalecany krok rozwiązywania problemów i nie gwarantuje, że problem nie będzie powtarzany. Przedstawię jeden z takich przykładów. Sporadyczne problemy często są trudne do izolowania i rozwiązywania. W tym scenariuszu aplikacja klienta będzie działać prawidłowo przez kilka godzin, a następnie nagle zakończy się niepowodzeniem z powodu poniższego błędu. Klient próbował już ponownie zainstalować program .NET Framework i system operacyjny. Wydawało się to rozwiązać problem przez kilka dni, ale potem pojawił się ponownie.

Uruchomienie pliku FileMon nie wykazało żadnych błędów ODMOWY DOSTĘPU . Wszystkie niezbędne uprawnienia do konta ASPNET zostały spełnione. Jedynym sposobem rozwiązania problemu jest ponowne uruchomienie urządzenia. Nawet resetowanie usług IIS nie pomogłoby. Myślisz: "Ah, Microsoft Software zawsze potrzebuje ponownego uruchomienia, aby odzyskać?" Cóż, mylisz się!

Kluczem jest przyjrzenie się bliżej komunikatowi o błędzie. Błąd wyraźnie mówi "nie można otworzyć pliku do zapisu", a nie zwykły błąd ODMOWA DOSTĘPU , więc myślę, że jest to jakiś inny proces, który przechowuje blokadę na pliku lub folderze i nie zezwala ASP.NET na zapisywanie w nim. Ma to sens, że ponowny rozruch zabija inny proces, a aplikacja ASP.NET zacznie działać ponownie, dopóki nieautoryzowany proces ponownie zablokuje plik. Logiczną rzeczą do zrobienia byłoby wyłączenie wszystkich programów antywirusowych, programów szpiegujących innych firm lub innego oprogramowania do monitorowania plików, które działa na serwerze. Nie chcę wskazywać żadnego konkretnego oprogramowania innej firmy. Ogólnie rzecz biorąc, oprogramowanie antywirusowe jest znane z tego, że powoduje wiele problemów dla aplikacji IIS i ASP.NET. Innym znanym problemem spowodowanym przez oprogramowanie antywirusowe jest utrata sesji z powodu recyklingu AppDomain po dotknięciu folderu Bin lub plików .config.

Wskazówka

Najprostszym sposobem wyłączenia usług innych firm jest:

  1. Wybierz pozycję Start, wybierz pozycję Uruchom, a następnie wpisz msconfig.
  2. Wybierz Usługi i zaznacz Ukryj wszystkie usługi firmy Microsoft.
  3. Wybierz pozycję Wyłącz wszystko , aby zatrzymać usługi innych firm.
  4. Wybierz Start, wybierz Uruchom, a następnie wpisz iisreset, aby ponownie załadować CLR do procesu roboczego.

Monitoruj aplikację, aby sprawdzić, czy problem występuje ponownie. Jeśli uruchamiasz wiele programów antywirusowych, użyj metody próbnej i błędu, aby określić, który konkretny program powoduje problem.

Uwaga

Jeśli ten sam błąd jest powtarzalny w 100 procentach czasu, oprogramowanie antywirusowe może nie być przyczyną. Mogą istnieć inne przyczyny tego błędu. Spróbuj utworzyć prostą aplikację testową ASP.NET, aby wyizolować, czy ten sam błąd występuje dla strony Test.aspx. Jeśli tak, sprawdź, czy wymagane listy kontroli dostępu (ACL) są dostępne dla ASP.NET.

Zobacz wymagane listy kontroli dostępu (ACL) ASP.NET.

Wskazówka

Folder %SystemRoot%\Assembly jest globalną pamięcią podręczną. Nie można bezpośrednio używać Eksploratora Windows do edytowania list ACL dla tego folderu.

Zamiast tego użyj wiersza polecenia i uruchom następujące polecenie:

cacls %windir%\assembly /e /t /p domain\useraccount:r

Alternatywnie przed użyciem Eksploratora Windows wyrejestruj Shfusion.dll za pomocą następującego polecenia, aby nadać uprawnienia za pośrednictwem graficznego interfejsu użytkownika:

C:\WINDOWS\Microsoft.NET\Framework\VersionNumber>regsvr32-u shfusion.dll

Po ustawieniu uprawnień za pomocą Eksploratora Windows ponownie zarejestruj Shfusion.dll za pomocą następującego polecenia:

C:\WINDOWS\Microsoft.NET\Framework\VersionNumber>regsvr32 shfusion.dll

Problem występuje z powodu braku uprawnień w zasobie zdalnym, do którego aplikacja ASP.NET próbuje uzyskać dostęp

Gdy aplikacja ASP.NET uzyskuje dostęp do zasobu zdalnego, takiego jak Microsoft SQL Server lub udział UNC (Universal Naming Convention), może wiele rzeczy pójść nie tak. Ponadto wiele rzeczy może być niepoprawnie skonfigurowanych w zasobie zdalnym. Aby umożliwić działanie zasobu, należy rozwiązać te problemy.

Pierwszym krokiem byłoby sprawdzenie, czy można nawiązać połączenie z serwerem zdalnym za pośrednictwem Eksploratora Windows.

  1. Na serwerze zdalnym utwórz folder o nazwie Test. Na kartach Udostępnianie i zabezpieczenia folderu Test dodaj domenę/konto, a także konto procesu używane przez aplikację ASP.NET i nadaj im pełną kontrolę.

  2. Na serwerze IIS zaloguj się przy użyciu domeny/konta, wybierz pozycję Uruchom, wybierz pozycję Uruchom, a następnie wpisz ścieżkę udziału UNC serwera zdalnego: \\RemoteServerName*\Test.

    Jeśli nie możesz uzyskać dostępu do tego folderu, skontaktuj się z administratorem sieci, aby rozwiązać ten problem. Tylko wtedy aplikacja ASP.NET może uzyskiwać dostęp do zasobu współdzielonego.

  3. Utwórz plik o nazwie CreateUNCFile.aspx przy użyciu poniższego kodu i zapisz plik w katalogu aplikacji.

    <%@ Page Language="vb" %>
    <%@ Import Namespace="System.IO" %>
    <html>
    <head>
    <title>Writing to a Text File</title>
    <script runat="server">
        Sub WriteToFile(ByVal sender As System.Object, ByVal e As System.EventArgs)
            Dim fp As StreamWriter
                fp = File.CreateText("\\<RemoteServerName>\Test\" & "test.txt")
                fp.WriteLine(txtMyFile.Text)
                lblStatus.Text = "The File Successfully created! Your ASP.NET process is able to access this remote share"
                fp.Close()
        End Sub
    </script>
    
    </head>
    <body style="font: 10pt verdana">
                <h3 align="center">Creating a Text File in ASP.NET</h3>
        <form id="Form1" method="post" runat="server">
                            Type your text:
                            <asp:TextBox ID="txtMyFile" TextMode="MultiLine" Rows="10" Columns="60" Runat="server" /><br>
                            <asp:button ID="btnSubmit" Text="Create File" OnClick="WriteToFile" Runat="server" />
                            <asp:Label ID="lblStatus" Font-Bold="True" ForeColor="#ff0000" Runat="server" />
        </form>
    </body>
    </html> 
    
  4. Upewnij się, że zmodyfikujesz <element RemoteServerName> w następującym wierszu kodu

    fp = File.CreateText("\\<RemoteServerName>\Test\" &"test.txt")
    

    Tak, aby odzwierciedlała nazwę serwera zdalnego.

  5. Otwórz program Windows Internet Explorer i przejdź do http://**IISServerName**/**AppName**/CreateUNCFile.aspx z komputera klienckiego innego niż serwer usług IIS.

  6. Jeśli plik Test.txt zostanie utworzony pomyślnie, aplikacja ASP.NET może uwierzytelnić się w zasobie zdalnym.

  7. Jeśli tworzenie pliku nie powiedzie się z przeglądarki Internet Explorer na komputerze klienta, ale powiedzie się, gdy przeglądasz tę samą stronę bezpośrednio z serwera IIS, prawdopodobnie napotykasz scenariusz "Podwójnego skoku". Jeśli używasz niestandardowych składników Web Parts do uzyskiwania dostępu do zasobów zdalnych, które wymagają uwierzytelniania i autoryzacji użytkownika, prawdopodobnie napotkasz problem "Double Hop". Aby uzyskać dostęp do zasobu zdalnego, może być konieczne podanie poświadczeń użytkownika końcowego do zasobu, aby dane wyjściowe z zasobu ograniczały się do danych, do których użytkownik końcowy ma uprawnienia dostępu.

W powyższych krokach założono, że w usługach IIS włączono uwierzytelnianie NTLM. Uwierzytelnianie podstawowe nie używa protokołu Kerberos.

Aby uzyskać więcej informacji, zobacz Rozwiązywanie problemów z błędami protokołu Kerberos w programie Internet Explorer.

Aby uzyskać więcej informacji na temat metod uwierzytelniania usług IIS, zobacz wycofaną dokumentację techniczną do Visual Studio 2003.

Wskazówka

Jeśli możesz nawiązać połączenie z zdalnym udziałem UNC, ale nie możesz nawiązać połączenia z serwerem zdalnym, na którym działa program SQL Server z aplikacji ASP.NET, może być konieczne sprawdzenie lub ustawienie głównych nazw usługi (SPN) dla programu SQL Server. Spróbuj włączyć tylko uwierzytelnianie podstawowe dla aplikacji w usługach IIS i sprawdź, czy możesz nawiązać połączenie z serwerem zdalnym z uruchomionym programem SQL Server.

Istnieje wiele innych przyczyn komunikatu o błędzie "Aplikacja serwera niedostępna". Dziennik zdarzeń to najlepsze trafienie, aby uzyskać więcej szczegółów na temat przyczyny problemu.

Dzienniki usług IIS są przydatne w przypadku błędów związanych z uwierzytelnianiem usług IIS.

Powinieneś zwrócić uwagę na kody statusu i podstatusu tego konkretnego błędu.

2006-10-12 22:47:28 W3SVC1 65.52.18.230 GET /MyAPP/login.aspx - 80  
MyDomain\UserID_91 65.52.22.58 Mozilla/4.0+  
(compatible;+MSIE+6.0;+Windows+NT+5.2;+SV1;+.NET+CLR+1.1.4322;+.NET+CLR+2.0.50727;+InfoPath.1) 401 3 5

Widzimy kod 401 z podstatusem 3, który oznacza "Nieautoryzowane z powodu ACL dla zasobu".

Oznacza to brak uprawnień systemu plików NTFS w pliku lub folderze. Ten błąd może wystąpić nawet wtedy, gdy uprawnienia są poprawne dla pliku, do którego próbujesz uzyskać dostęp, ale w innych folderach SYSTEM i IIS mogą brakować uprawnień domyślnych i praw użytkownika. Na przykład ten błąd może zostać wyświetlony, jeśli konto IUSR_ComputerName nie ma dostępu do katalogu C:\Winnt\System32\Inetsrv.

Wskazówka

Wybierz pozycję Start, wybierz pozycję Uruchom, a następnie wpisz logfile, aby otworzyć folder zawierający dzienniki usług IIS. Alternatywnie na stronie właściwości witryny sieci Web w usługach IIS wybierz kartę WebSiteName , a następnie w obszarze Aktywny format dziennika wybierz pozycję Właściwości , aby wyświetlić katalog i nazwę pliku dziennika.

Inną interesującą rzeczą jest kod stanu 5. Aby uzyskać więcej informacji na temat tego kodu stanu, możesz użyć polecenia net helpmsg:

C:\Documents and Settings\User> net helpmsg 5

Odmowa dostępu.

Wypróbujmy inny wspólny kod stanu, kod 50:

C:\Documents and Settings\User> net helpmsg 50

Żądanie nie jest obsługiwane.

Wskazówka

Za każdym razem, gdy zostanie wyświetlony inny ogólny niesławny komunikat "500 Wewnętrzny błąd serwera", dobrym pomysłem jest wyłączenie przyjaznych komunikatów o błędach HTTP, dzięki czemu otrzymasz szczegółowy opis błędu. Nie zapomnij spojrzeć do podglądu zdarzeń, ponieważ może zawierać dodatkowe informacje.

Chodzi o użycie wszystkich zarejestrowanych informacji dostępnych w celu uzyskania maksymalnych szczegółów dotyczących problemu.

Zasoby

Aby uzyskać więcej informacji, zobacz: