12

Possiedo un sito Web ASP.NET con autenticazione tramite ActiveDirectory.ASP.NET WindowsAuthentication personalizzato 401 Errore pagina non autorizzata

Ora, quando un utente autenticato apre una pagina - viene automaticamente autenticato. Ho riscontrato un problema: quando un utente non autenticato (, ad esempio, un utente Mozilla Firefox con proprietà non definita network.automatic-ntlm-auth.trusted-uris) apre una pagina, IIS invia 401 risposte e richiede un login \ password.

Quello che voglio è non chiedergli un login \ password - mostra solo una pagina di errore personalizzata. Sembra piuttosto semplice: gli utenti autenticati ottengono la pagina richiesta, i non autentificati vengono reindirizzati a una pagina di errore personalizzata. Funzionerebbe bene per FormsAuthentication.

Tuttavia, ho provato così tanti modi ormai. Qualsiasi reindirizzamento Web.config non funziona. Anche se cancello uno Response e inserisco un reindirizzamento, riceverò un ciclo perché questa pagina personalizzata (* ad esempio, /Error/AccessDenied) richiede anche l'autenticazione. Contrassegnare un controller come AllowAnonymous non fa nulla.

Tuttavia, se si attiva l'autenticazione anonima in Gestione IIS, gli utenti di dominio autenticato reale non sono autorizzati quando aprono un sito Web.

Come posso risolvere questo problema?

+0

Si desidera che gli utenti non-IE per essere reindirizzare a un'altra pagina? La riscrittura degli URL basata su User Agent è la strada da percorrere. –

+0

Non possibile. La prima richiesta dal browser è sempre anonima. IIS risponde sempre con "401 Non autorizzato" con "www.authenticate: negotiate" (o NTLM o entrambi). Il client (browser) quindi richiede di nuovo l'intestazione 'Autorizzazione: Negoziare ..hash..' questa volta. A seconda del sito attendibile, il browser *** chiederà sempre le credenziali. Non puoi mostrare un errore personalizzato, perché la prima risposta è sempre '401', a prescindere. – Abhitalks

+0

È possibile scrivere un modulo HTTP e collegarsi a HttpApplication.PostAuthenticateRequest. Da lì è possibile utilizzare HttpContext.RewritePath e/o giocare praticamente con il contesto di risposta nel modo desiderato. Difficile dire di più senza un chiaro caso di riproduzione. –

risposta

14

Grazie a @Abhitalks per spiegare come funziona nei commenti. Non so perché, ma ero sicuro che IE e Google Chrome stessero inviando l'intestazione di autorizzazione alla prima richiesta e, ecco perché, solo gli utenti non autorizzati ottengono la risposta 401. Dopo aver capito che non posso evitare affatto la risposta 401, ho deciso di utilizzare questo approccio semplice in quanto questo comportamento è il più vicino al desiderabile.

ho aggiunto il seguente metodo in Global.asax:

protected void Application_EndRequest(object sender, EventArgs e) 
{ 
    if (Response.StatusCode == 401) 
    { 
     Response.ClearContent(); 
     Response.WriteFile("~/Static/NotAuthorized.html"); 
     Response.ContentType = "text/html"; 
    } 
} 

Ora, quando un utente apre una pagina, il server lo restituisce una pagina di errore personalizzata, ma con 401 Unauthorized colpo di testa.

Chrome, IE o Firefox ben configurato. Gli utenti richiedono un URL, il server restituisce la pagina di errore con 401 intestazione: un browser completa automaticamente la richiesta di autorizzazione, reindirizza allo stesso URL, il server restituisce la pagina corretta e 200 ora. L'utente non vedrà questa pagina di errore.

Firefox non configurato. L'utente richiede un URL, il server restituisce la pagina di errore con 401 header - un browser non può completare la richiesta di autorizzazione e richiede all'utente le credenziali.

  • utente inserisce corretto login. L'utente richiede di nuovo lo stesso URL, ottiene una pagina e 200 OK.

  • L'utente accede al login errato. Un browser richiede nuovamente le credenziali.

  • Le pressioni utente Annulla. Un browser visualizza la pagina di errore personalizzata che è stata inviata con l'intestazione 401.Questa pagina dice all'utente che se sta usando Firefox, allora dovrebbe inserire le sue credenziali o consentire l'autenticazione NTLM automatica.

+0

Grazie, cercavo questo. +1 per te – KoenW

1

importante aggiunta al commento di Yeldar:

Quando alterare il messaggio di risposta per le richieste remote (leggi: non localhost) sarà necessario aggiungere quanto segue al file di configurazione:

<system.webServer> 
    <httpErrors existingResponse="PassThrough"></httpErrors> 
</system.webServer> 

Se non si consente alla risposta di "passare attraverso" i client remoti otterrà il valore predefinito "You do not have permission to view this directory or page".

ho avuto queste informazioni da: https://stackoverflow.com/a/17324195/3310441

Problemi correlati