Apache: como definir a página de erro 401 personalizada e salvar o comportamento original

4

Eu tenho autenticação baseada em Kerberos com Apache / 2.2.3 (Linux / SUSE). Quando o usuário está tentando abrir algum URL, o navegador pergunta a ele sobre o login e a senha do domínio, como em HTTP Basic Auth. Se o usuário cancelar essa solicitação 3 vezes, o Apache retorna a página de erro 401 Authorization Required . Minha configuração atual do host virtual é

    <Directory /home/user/www/current/public/>
            Options -MultiViews +FollowSymLinks
            AllowOverride None
            Order allow,deny
            Allow from all
            AuthType Kerberos
            AuthName "Domain login"
            KrbAuthRealms DOMAIN.COM
            KrbMethodK5Passwd On
            Krb5KeyTab /etc/httpd/httpd.keytab
            require valid-user
    </Directory>

Eu quero definir uma boa página de erro 401 personalizada com algumas instruções para os usuários. E eu adicionei essa linha na configuração do host virtual:

 ErrorDocument 401 /pages/401

Funciona, quando o usuário não pode autorizar o apache, redireciona-o para a minha página legal. Mas o Apache não pergunta ao login / senha do usuário como antes. Eu quero essa funcionalidade e boa página de erro simultaneamente!

É possível fazer isso funcionar corretamente?

    
por petRUShka 03.07.2012 / 19:55

2 respostas

3

Em primeiro lugar, quando eu usei

ErrorDocument 401 /pages/401

/pages/401 foi conteúdo gerado por back-end dinâmico. Quando criei% static static 401.html e defini

ErrorDocument 401 /401.html

o sistema inteiro começou a funcionar corretamente. Portanto, a solução é: não use páginas dinâmicas para exibir o erro 401, use html estático.

    
por 05.07.2012 / 11:11
1

O comportamento que você está descrevendo é lado do cliente e não tem nada a ver com o Apache, por si só.

Veja o que realmente acontece:

  1. O navegador envia uma solicitação
  2. O servidor da Web responde com 401
  3. O navegador solicita credenciais ao usuário
  4. O navegador reenvia a solicitação com credenciais

Se o acesso for concedido, o Apache responde com 200, se o acesso não for concedido, ele volta para a etapa 2 e continua. Cabe ao usuário-agente (ou seja, seu navegador) quantas vezes ele vai tentar. Seu navegador aparentemente pára em 3 tentativas. Depois disso, ele mantém o resultado em cache e apenas mostra a página de erro.

Os navegadores costumam armazenar em cache os resultados desse tipo de operação, o que é normal. Você saiu do seu navegador antes de tentar novamente? Isso deve limpar o resultado em cache.

Se você quiser ver exatamente como o Apache está se comportando "in the raw", use o seguinte:

Pedido não autenticado:

curl -D - http://yourserver/page.html

Pedido autenticado *:

curl -u user:pass -D - http://yourserver/page.html

Você verá os cabeçalhos no topo da saída de como o Apache responde a solicitações autenticadas vs não autenticadas. Você deve sempre ver um 401 para unauth e 200 para auth. Se esse não é o caso, então ele não está configurado corretamente ou há algo mais acontecendo.

* curl pode fazer a autenticação do kerberos passando --negotiate , mas nunca fiz isso e não tenho um ambiente de teste válido para experimentar. Leia o manual curl(1) para obter mais informações.

    
por 03.07.2012 / 21:01