IIS 7.5 sobrescreve seletivamente minha página de resposta de erro

1

Usando o Windows 2008r2, IIS 7.5, eu tenho um aplicativo usando a autenticação integrada do Windows (WWW-Authenticate: NTLM, Negotiate).

No meu código ASP.NET MVC, estou sobrescrevendo a saída da página de erro do IIS ...

    protected void Application_EndRequest(Object sender, EventArgs e)
    {
        HttpContext context = ((HttpApplication)sender).Context;
        if (context.Response.Status.Substring(0, 3).Equals("401"))
        {
            HttpApplication app = (HttpApplication)sender;

            string returnUrl = Response.ApplyAppPathModifier("~/OpenId/AskUser").ToString();
            string url = new Uri(this.Request.Url, Response.ApplyAppPathModifier("~/Account/Login?returnUrl=" + returnUrl)).ToString();
            app.Response.ClearContent();
            app.Response.Write(string.Format("<!DOCTYPE html><html lang=\"en\"><head><meta charset=\"utf-8\"><meta http-equiv=\"refresh\" content=\"0;URL='{0}'\"><title>Error Authenticating</title><script language=\"javascript\">self.location='{0}';</script></head><body>Error Authenticating</body></html>", url));
        }
    }

O objetivo é redirecionar o usuário se ele estiver em um computador ou dispositivo móvel que não seja Windows (ou usando o Firefox em um PC com Windows) para um login baseado em formulários que eles possam usar em vez de esperar suas credenciais do Windows via Windows Integrated Auth.

O problema que estou encontrando com o IIS 7.5 no servidor é que mesmo que esse evento EndRequest esteja disparando (posso dizer de um cabeçalho X-DEBUG que inseri no código e observando o violinista), a saída HTML foi enviada de volta para o client é a página de erro padrão do IIS 7.5 para o código de status http 401, não para a página HTML que estou transmitindo. A primeira vez que o requeest é enviado (a primeira solicitação com a resposta 401) funciona bem, mas se o usuário clicar em OK com uma combinação de nome de usuário / senha vazia ou incorreta, as respostas 401 subsequentes não incluirão a saída adequada no corpo do resposta (seja a página de resposta padrão do IIS 7.5 401 ou uma simples sentença de texto e sem HTML).

Observe que isso não acontece no IIS 7.5 Express na minha caixa de desenvolvedor - ele exibe corretamente a página HTML do segmento de código acima. Isso só acontece quando eu implantar o projeto no servidor da Web do IIS 7.5.

Eu também tentei criar uma página de erro personalizada ... no meu web.config eu adicionei o seguinte em system.webServer ...

<httpErrors>
  <remove statusCode="401"/>
  <error statusCode="401" prefixLanguageFilePath="" path="ErrorPages/401.html" responseMode="File" />
</httpErrors>

E criei e implantei o arquivo HTML correspondente. Depois que fiz isso, não recebi mais a página de erro padrão do IIS 7.5, mas agora recebo apenas a seguinte resposta de texto simples (não HTML): "Você não tem permissão para visualizar este diretório ou página".

Estou perdido porque o IIS Express está exibindo tudo corretamente, enquanto o IIS 7.5 não está. Mesmo quando digo ao IIS 7.5 para gerar uma página diferente para esse tipo de erro, ele ainda não faz isso.

    
por siromega 26.03.2013 / 22:26

1 resposta

3

Esta parece ser uma cópia do link , mas eu sou muito novo no Server Fault para sinalizar isso.

Minha opinião: Eu tive um problema semelhante ao usar o Mediawiki em uma caixa do servidor IIS.

Quando você navega até uma página não existente no Mediawiki. Ele envia de volta uma página wiki especial que diz que a página não existe e permite que você a crie. No entanto, esta página é enviada com um status de 404.

Em um servidor IIS padrão, o IIS substituirá automaticamente isso por uma página de erro personalizada para os usuários que NÃO estão no host local, mas envia mensagens de erro detalhadas para aqueles que estão. Na prática, "mensagens de erro detalhadas" significa passar pela página de erro original, seja ela personalizada em seu aplicativo ou gerada pelo ASP.NET devido a um erro de codificação.

Meu método era ativar mensagens de erro detalhadas para usuários locais e remotos nas Páginas de erro > Configurações de recursos. No entanto, isso também permitirá que usuários remotos vejam mensagens de erro ASP detalhadas, caso ocorram, o que pode ajudar um usuário mal-intencionado a comprometer sua segurança.

Outras opções são dadas como respostas à pergunta vinculada, incluindo as melhores que podem não ter uma implicação de segurança. Outra opção neste caso é não retornar um código de status 401, mas apenas um código 200 normal com sua página personalizada. Isso sacrifica os princípios do REST para facilitar o desenvolvimento.

Observe que o fato de as mensagens de erro detalhadas serem mostradas para o usuário local, mas não para usuários remotos, pode explicar por que suas soluções funcionam durante o teste local, mas não quando implantadas.

    
por 18.11.2013 / 14:55