Risoluzione dei problemi comuni relativi alle autorizzazioni e alla sicurezza in ASP.NET

Questo articolo illustra come risolvere i problemi comuni relativi alle autorizzazioni e alla sicurezza in ASP.NET.

Versione originale del prodotto: ASP.NET
Numero KB originale: 910449

Strumenti utili

Prima di tentare di risolvere qualsiasi problema, è necessario acquisire familiarità con alcuni strumenti, che consentono di limitare il problema. In questo caso, si potrebbe essere interessati a strumenti come FileMon, RegMon e Controllo di sicurezza. Per altre informazioni su FileMon, vedere FileMon per Windows v7.04.

Per altre informazioni su RegMon, vedere Windows Sysinternals.

Eseguire il drill-down per isolare il problema

  • L'applicazione ha mai funzionato? In caso affermativo, cosa è cambiato che avrebbe potuto causare l'interruzione dell'applicazione? È possibile che nel server siano stati applicati aggiornamenti software o aggiornamenti della sicurezza. Un'implementazione del codice potrebbe anche aver causato il problema.
  • Le pagine semplici .html e .asp vengono servite da IIS?
  • È stata eseguita la migrazione dell'applicazione a una versione diversa di IIS?
  • Altre applicazioni ASP.NET nel server hanno esito negativo con lo stesso errore? Si tratta dell'unica applicazione che ha esito negativo?
  • Il problema si verifica per tutti gli utenti o solo per utenti specifici?
  • Il problema è riproducibile durante l'esplorazione in locale nel server Web o è riproducibile solo per pochi client?
  • Se si usa la rappresentazione, l'utente rappresentato ha l'accesso necessario alla risorsa?

Le domande precedenti sono utili per diagnosticare un problema. Se si pubblica il problema in uno dei forum ASP.NET e se si hanno già le risposte alla maggior parte di queste domande, è probabile che si otterrà un puntatore rapido o una soluzione al problema. La chiave consiste nel pubblicare l'intero errore di traccia dello stack ASP.NET, se applicabile, invece di dire "Viene visualizzato un errore di accesso negato durante il tentativo di eseguire l'applicazione ASP.NET. Qualcuno può aiutare?" È molto più facile per qualcuno esaminare la traccia dello stack e fornire puntatori quando possono visualizzare un messaggio di errore completo. Quindi devi chiederti...

Qual è il messaggio di errore esatto?

La prima domanda che facciamo ai clienti è: "Qual è il messaggio di errore esatto?" Se si dispone di una descrizione chiara del messaggio di errore generato da Microsoft .NET Framework, è possibile ignorare questa sezione. Se l'applicazione maschera il messaggio di errore effettivo e restituisce invece un messaggio di errore descrittivo, ad esempio "Si è verificato un errore imprevisto. Per informazioni dettagliate, contattare l'amministratore del sito Web. Ecco alcuni passaggi che consentono di ottenere il messaggio di errore effettivo.

  • Individuare e aprire il file Web.config nella directory dell'applicazione e impostare customErrors su mode="Off". Salvare il file e riprodurre il problema.

  • Potrebbe ancora non essere possibile visualizzare il messaggio di errore effettivo dopo aver seguito il passaggio precedente a causa della gestione personalizzata di eventi/errori eseguita dallo sviluppatore dell'applicazione. È possibile provare a individuare l'evento Application_Error nel file Global.asax e impostare come commento qualsiasi codice che usa la Server.Transfer("Errors.aspx") funzione per passare a una pagina di errore personalizzata.

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

Dopo aver visualizzato il messaggio di errore effettivo, leggerlo per determinare se l'errore è causato da autorizzazioni mancanti in una risorsa locale o in una risorsa remota a cui l'applicazione ASP.NET sta tentando di accedere.

Consiglio

È possibile contattare lo sviluppatore per scoprire come visualizzare il messaggio di errore effettivo. È possibile che lo sviluppatore stia registrando un file o ricevendo notifiche tramite posta elettronica. Ricordarsi sempre di eseguire un backup di qualsiasi file che si intende modificare. Con un backup disponibile, è sempre possibile eseguire il rollback delle modifiche.

Il problema si verifica a causa delle autorizzazioni mancanti in una risorsa locale a cui l'applicazione ASP.NET tenta di accedere

Se non è possibile ottenere una descrizione chiara del problema a causa di un messaggio di errore personalizzato, eseguire FileMon e riprodurre il problema. Arrestare e salvare l'acquisizione come FileMon.xls e aprire il file in Microsoft Excel. Scegliere Filtro dal menu Dati, quindi fare clic su Filtro automatico per usare le funzionalità di filtro di Excel. Selezionare ora l'elenco a discesa nella colonna F e cercare gli errori "ACCESSO NEGATO".

Di seguito è riportato un output FileMon di esempio.

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

Come si può notare dai risultati filtrati, la causa del problema è stata ridotta. FileMon mostra che all'account NT AUTHORITY\NETWORK SERVICE mancano le autorizzazioni NTFS nella C:\Winnt\Microsoft.net\Framework\v1.1.4322\Temporary ASP.NET Files cartella. Questo dovrebbe essere direttamente in avanti per correggere.

Consiglio

Un buon passaggio è quello di modificare l'account del processo di ASP.NET in un account Amministrazione per verificare se risolve il problema. In IIS 6.0 e versioni successive è necessario modificare l'identità di Iis AppPool in "Sistema locale" per verificare se l'applicazione funziona.

Nota

Questa operazione non deve essere usata come soluzione, ma solo come passaggio di risoluzione dei problemi.

La maggior parte delle persone tenderebbe a reinstallare Microsoft .NET Framework o addirittura a reinstallare il sistema operativo. Questo passaggio non è consigliato per la risoluzione dei problemi e non garantisce che il problema non si ripeta. Ne fornirò uno di questi esempi. I problemi intermittenti sono spesso difficili da isolare e risolvere. In questo scenario l'applicazione del cliente funziona correttamente per alcune ore e quindi all'improvviso non riesce con l'errore seguente. Il cliente aveva già provato a reinstallare .NET Framework e il sistema operativo. Questo sembrava risolvere il problema per alcuni giorni, ma poi riappare.

L'esecuzione di FileMon non ha mostrato errori ACCESS DENIED . Tutte le autorizzazioni necessarie per l'account ASPNET erano disponibili. L'unico modo per eseguire il ripristino dal problema consiste nel riavviare la casella. Anche la reimpostazione di IIS non sarebbe utile. Si sta pensando "Ah, Microsoft Software ha sempre bisogno di un riavvio per il ripristino?" Beh, ti sbagli!

La chiave qui è esaminare attentamente il messaggio di errore. L'errore indica chiaramente "non è possibile aprire un file per la scrittura" e non il solito errore ACCESS DENIED , quindi penso che si tratti di un altro processo che contiene un blocco su un file o una cartella e non consente a ASP.NET di scrivervi. Ha senso che un riavvio stava uccidendo l'altro processo e l'applicazione ASP.NET ricomincia a funzionare fino a quando il processo non autorizzato blocca nuovamente il file. La cosa logica da fare sarebbe disattivare tutti i programmi antivirus, spyware di terze parti o qualsiasi altro software di monitoraggio dei file eseguito nel server. Non voglio segnalare alcun software di terze parti specifico. Ma, in generale, il software antivirus è noto per causare molto dolore per IIS e applicazioni ASP.NET. Un altro problema noto causato dal software antivirus è la perdita di sessione dovuta al riciclo di AppDomain quando viene toccata la cartella Bin o i file .config.

Consiglio

Il modo più semplice per disattivare i servizi di terze parti consiste nel:

  1. Fare clic su Start, fare clic su Esegui e quindi digitare msconfig.
  2. Selezionare Servizi e selezionare Nascondi tutti i servizi Microsoft.
  3. Fare clic su Disabilita tutto per arrestare i servizi di terze parti.
  4. Fare clic su Start, fare clic su Esegui e quindi digitare iisreset per ricaricare CLR nel processo di lavoro.

Monitorare l'applicazione per verificare se il problema si verifica nuovamente. Se si eseguono più programmi antivirus, usare il metodo di valutazione e errore per determinare quale programma specifico causa il problema.

Nota

Se lo stesso errore è riproducibile al 100% del tempo, il software antivirus potrebbe non essere la causa. Questo errore può essere causato da altre cause. Provare a creare una semplice applicazione di test ASP.NET per isolare se si verifica lo stesso errore per una pagina di Test.aspx. In tal caso, verificare che le Controllo di accesso Elenchi necessarie siano tutte disponibili per ASP.NET.

Vedere ASP.NET Required Controllo di accesso Elenchi (ACL).

Consiglio

La %SystemRoot%\Assembly cartella è la Global Assembly Cache. Non è possibile usare direttamente Esplora risorse per modificare gli elenchi di controllo di accesso per questa cartella.

Usare invece un prompt dei comandi ed eseguire il comando seguente:

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

In alternativa, prima di usare Esplora risorse, annullare la registrazione Shfusion.dll con il comando seguente per concedere le autorizzazioni tramite l'interfaccia utente grafica:

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

Dopo aver impostato le autorizzazioni con Esplora risorse, registrare nuovamente Shfusion.dll con il comando seguente:

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

Il problema si verifica a causa delle autorizzazioni mancanti in una risorsa remota a cui l'applicazione ASP.NET sta tentando di accedere

Quando l'applicazione ASP.NET accede a una risorsa remota, ad esempio Microsoft SQL Server o una condivisione UNC (Universal Naming Convention), esistono molti problemi. Inoltre, molti elementi potrebbero essere configurati in modo non corretto nella risorsa remota. È necessario risolvere questi problemi per far funzionare la risorsa.

Il primo passaggio consiste nel vedere se è possibile connettersi al server remoto tramite Esplora risorse.

  1. Nel server remoto creare una cartella denominata Test. Nelle schede Condivisione e sicurezza della cartella Test aggiungere il dominio/account e anche l'account di processo usato dall'applicazione ASP.NET e assegnare entrambi il controllo completo.

  2. Nel server IIS accedere con il dominio o l'account, fare clic su Start, fare clic su Esegui e quindi digitare il percorso di condivisione UNC del server remoto: \\RemoteServerName*\Test.

    Se non è possibile accedere a questa cartella, contattare l'amministratore di rete per risolvere il problema. Solo allora l'applicazione ASP.NET può accedere alla condivisione.

  3. Creare un file denominato CreateUNCFile.aspx con il codice seguente e salvare il file nella directory dell'applicazione.

    <%@ 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. Assicurarsi di modificare <RemoteServerName> nella riga di codice seguente

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

    In modo che rifletta il nome del server remoto.

  5. Aprire Windows Internet Explorer e passare a http://**IISServerName**/**AppName**/CreateUNCFile.aspx da un computer client diverso dal server IIS.

  6. Se il file Test.txt viene creato correttamente, l'applicazione ASP.NET può eseguire l'autenticazione nella risorsa remota.

  7. Se la creazione di file non riesce da un browser client di Internet Explorer, ma funziona se si passa alla stessa pagina dal server IIS stesso, è probabile che si stia eseguendo uno scenario di "doppio hop". Se si usano web part predefinite personalizzate per accedere a risorse remote che richiedono l'autenticazione e l'autorizzazione dell'utente, probabilmente si verificherà il problema "Doppio hop". Per accedere alla risorsa remota, potrebbe essere necessario fornire le credenziali dell'utente finale alla risorsa in modo che l'output della risorsa sia limitato ai dati a cui l'utente finale ha l'autorizzazione per accedere.

I passaggi precedenti presuppongono che l'autenticazione NTLM sia attivata in IIS. L'autenticazione di base non usa Kerberos.

Per altre informazioni, vedere Risolvere gli errori Kerberos in Internet Explorer.

Per altre informazioni sui metodi di autenticazione IIS, vedere la documentazione tecnica ritirata di Visual Studio 2003.

Consiglio

Se è possibile connettersi alla condivisione UNC remota ma non è possibile connettersi al server remoto che esegue SQL Server dall'applicazione ASP.NET, potrebbe essere necessario controllare o impostare i nomi dell'entità servizio (SPN) per SQL Server. Provare ad abilitare solo l'autenticazione di base per l'applicazione in IIS e verificare se è possibile connettersi al server remoto che esegue SQL Server.

Esistono numerose altre cause per il messaggio di errore "Applicazione server non disponibile". Il registro eventi è la soluzione migliore per ottenere maggiori dettagli sulla causa del problema.

I log IIS sono utili nei casi di errori correlati all'autenticazione IIS.

È necessario cercare i codici di stato e di stato secondario per questo particolare errore.

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

Viene visualizzato un valore 401 con lo stato secondario 3, che indica "Non autorizzato a causa dell'ACL nella risorsa".

Indica le autorizzazioni NTFS mancanti per un file o una cartella. Questo errore può verificarsi anche se le autorizzazioni sono corrette per il file a cui si sta tentando di accedere, ma le autorizzazioni predefinite e i diritti utente potrebbero non essere presenti in altre cartelle SYSTEM e IIS. Ad esempio, è possibile che venga visualizzato questo errore se l'account IUSR_ComputerName non ha accesso alla directory C:\Winnt\System32\Inetsrv.

Consiglio

Fare clic su Start, fare clic su Esegui e quindi digitare logfiles per aprire la cartella che contiene i log IIS. In alternativa, nella pagina delle proprietà del sito Web in IIS fare clic sulla scheda WebSiteName e in Formato log attivo fare clic su Proprietà per visualizzare la directory e il nome del file di log.

L'altro aspetto interessante è il codice di stato 5. È possibile usare il comando net helpmsg per ottenere altre informazioni su questo codice di stato:

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

Accesso negato.

Provare un altro codice di stato comune, il codice 50:

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

La richiesta non è supportata.

Consiglio

Ogni volta che si riceve un altro messaggio generico noto "Errore del server interno 500", è consigliabile disabilitare i messaggi di errore HTTP descrittivi, in modo da ricevere una descrizione dettagliata dell'errore. Non dimenticare di guardare nel Visualizzatore eventi perché potrebbe contenere anche altre informazioni.

L'idea è quella di usare tutte le informazioni registrate disponibili per ottenere i dettagli massimi sul problema a portata di mano.

Risorse

Per ulteriori informazioni consulta: