Entrar com a conta da Microsoft
Entrar ou criar uma conta.
Olá,
Selecionar uma conta diferente.
Você tem várias contas
Escolha a conta com a qual você deseja entrar.

Coluna de voz de suporte do ASP .NET

Solução de problemas de autenticação de formulários

Bem-vindo à coluna voz de suporte ASP.NET! Meu nome é Jerry Orman. Estou na Microsoft há mais de cinco anos e passei a maior parte do meu tempo focado em tecnologias relacionadas à Web, como o Microsoft FrontPage e as novas tecnologias do Microsoft SharePoint. Passei o último ano trabalhando com a Microsoft ASP.NET como engenheiro de suporte. Este mês, na coluna Voz de Suporte, vou explicar como solucionar problemas da Autenticação de Formulários no Microsoft ASP.NET.

Solução de problemas de autenticação de formulários

Ao usar a Autenticação de Formulários em um aplicativo ASP.NET, talvez seja necessário solucionar um problema que ocorre quando o usuário é redirecionado aleatoriamente para a página de logon. Em um mundo ideal, esse problema ocorreria de uma maneira que permitiria anexar facilmente um depurador e capturar o problema. Em ambientes de produção, no entanto, isso raramente é o caso. Para solucionar um problema aleatório como este, você precisa registrar informações relacionadas ao problema para que você possa reduzir a causa raiz.

Nesta coluna, abordaremos brevemente o conceito de Autenticação de Formulários. Em seguida, examinaremos quais cenários levam um usuário a ser redirecionado para a página de logon e como capturar dados relevantes para isolar o problema. Também abordaremos como implementar uma interface IHttpModule para registrar as informações de Autenticação do Forms.

Visão geral da Autenticação de Formulários

Quando um usuário se autentica em um site usando a Autenticação de Formulários, o servidor cria um cookie. O valor do cookie é um tíquete de autenticação de formulários criptografados. O cookie é passado para o servidor em cada solicitação para o aplicativo e a classe FormsAuthenticationModule descriptografa o valor do cookie e determina se o usuário é válido ou não.

Por padrão, a classe FormsAuthenticationModule é adicionada no arquivo Machine.config. A classe FormsAuthenticationModule gerencia o processo FormsAuthentication.

A seguir está uma entrada do arquivo Machine.config:

<httpModule>
     …other modules…
     <add name="FormsAuthentication"
         type="System.Web.Security.FormsAuthenticationModule" />
     …other modules…
</httpModule>

O tráfego HTTP geral para autenticação usando a Autenticação de Formulários é semelhante ao seguinte:

  1. O cliente envia um HTTP GET para Default.aspx. Nenhum cookie de autenticação de formulários é enviado.

  2. O servidor envia uma resposta 302 (redirecionamento) para Login.aspx.

  3. O cliente envia um POST HTTP para Logon.aspx. Ele inclui as informações de logon.

  4. O servidor envia uma resposta 302 (redirecionamento) para Default.aspx. O cookie de autenticação de formulários está incluído.

  5. O cliente envia um HTTP GET para Default.aspx. Isso inclui o cookie de autenticação de formulários.

Para obter mais informações sobre como implementar e usar a autenticação de formulários, visite os seguintes sites do MSDN:

http://msdn2.microsoft.com/en-us/library/7t6b43z4.aspx

http://msdn2.microsoft.com/en-us/library/system.web.security.formsauthentication(vs.71).aspx

http://msdn2.microsoft.com/en-us/library/system.web.security.formsauthenticationticket(vs.71).aspxPara obter mais informações sobre o compartilhamento de cookies de autenticação de formulários, visite o seguinte ASP.NET site da Web:

http://quickstarts.asp.net/QuickStartv20/aspnet/doc/security/formsauth.aspx

Motivos pelos quais um usuário pode ser redirecionado para a página de logon

O cookie de autenticação de formulários é perdido

Cenário 1


Nesse cenário, um usuário faz logon no site da Web. Em algum momento, o cliente envia uma solicitação para o servidor e o
A classe FormsAuthenticationModule não recebe o cookie. Você pode determinar se uma solicitação de usuário não contém o cookie habilitando o log de cookie em Serviços de Informações da Internet da Microsoft (IIS). Para fazer isso, siga estas etapas:

  1. Abra o MMC (Console de Gerenciamento da Microsoft) do IIS.

  2. Clique com o botão direito do mouse no site da Web e clique em
    Propriedades.

  3. Clique na guia Site da Web e clique em Habilitar log.

  4. Verifique se o formato de log é formato de arquivo de log estendido W3C.

  5. Clique em Propriedades.

  6. Clique na guia Avançado e clique em
    Propriedades Estendidas.

  7. Em Propriedades Estendidas, clique para selecionar a caixa cookie(cs(Cookie)) marcar e a caixa de marcar Referer (cs(Referer)).

Depois que esse problema ocorrer, determine qual cliente tinha o problema e o endereço IP desse cliente. Filtre o log do IIS no endereço IP desse cliente e exiba a coluna> de cookie <.

Observação Você pode usar o Log Parser para analisar os logs do IIS. Para baixar o Log Parser, visite o seguinte site da Microsoft:

http://www.microsoft.com/download/details.aspx?FamilyID=890cd06b-abf8-4c25-91b2-f8d975cf8c07 Depois de ter a lista de solicitações desse usuário específico, pesquise as solicitações na página de logon. Você sabe que eles foram redirecionados para esta página e você deseja ver as solicitações antes do redirecionamento ocorrer. Se você vir algo semelhante ao seguinte, o cliente não enviou o cookie ou o cookie foi removido na rede entre o cliente e o servidor.

Este é o logon inicial.

Método

Página

Resposta

Cookies

OBTER

/Default.aspx

302 (Redirecionamento)

Sem Cookies

OBTER

/Login.aspx

200 (Sucesso)

Sem Cookies

POSTAR

/Login.aspx

302 (Redirecionamento)

Sem Cookies

OBTER

/Default.aspx

200 (Sucesso)

. ASPXAUTH

OBTER

/SomePage.aspx

302 (Redirecionamento)

Não. ASPXAUTH Cookie

Estas são outras solicitações, seguidas por uma solicitação para uma página no site sem o . Cookie ASPXAUTH.

Método

Página

Resposta

Cookies

OBTER

/SomePage.aspx

302 (Redirecionamento)

Não. ASPXAUTH Cookie

OBTER

/Login.aspx

200 (Sucesso)

Não. ASPXAUTH Cookie

POSTAR

/Login.aspx

302 (Redirecionamento)

Não. ASPXAUTH Cookie

OBTER

/SomePage.aspx

200 (Sucesso)

. ASPXAUTH


Observação A primeira solicitação desse usuário provavelmente não terá um cookie de autenticação de formulários, a menos que você esteja criando um cookie persistente. O Log do IIS só mostrará os cookies recebidos na solicitação. A primeira solicitação para ter o cookie de autenticação de formulários estará na solicitação após uma tentativa de logon bem-sucedida.

Cenário 2


O cookie de autenticação de formulários também pode ser perdido quando o limite de cookie do cliente é excedido. No Microsoft Internet Explorer, há um limite de 20 cookies. Depois que o 20º cookie é criado no cliente, os cookies anteriores são removidos da coleção do cliente. Se o . O cookie ASPXAUTH é removido, o usuário será redirecionado para a página de logon quando a próxima solicitação for processada.

Você pode solucionar esses dois cenários da mesma forma. Examine a solicitação pouco antes do redirecionamento para a página de logon. Se a solicitação a esta página gerar cookies, isso será algo a ser investigado.

Você pode usar o Fiddler para exibir os cabeçalhos HTTP enviados para o cliente. Depois de capturar o tráfego, clique duas vezes em uma solicitação e clique em Cabeçalhos para ver o cabeçalho Set-Cookie. Se você rastrear um logon bem-sucedido, verá o cabeçalho Set-Cookie na resposta de um logon bem-sucedido.

Para baixar o Fiddler, visite o seguinte site do Fiddler:

http://www.fiddlertool.com/fiddler/

Cenário 3


Após a solicitação sair do cliente, há várias camadas que podem afetar os pacotes que estão sendo enviados. Para determinar se um dispositivo de rede está removendo o cookie, você precisa capturar um rastreamento de rede no cliente e no servidor e, em seguida, procurar no corpo da solicitação do cookie. Você deseja examinar a solicitação do cliente para verificar se o cookie foi enviado e marcar o rastreamento do servidor para verificar se o servidor recebeu o cookie.

Solicitação do

cliente Essa é uma solicitação GET após a autenticação do usuário. As informações do tíquete de autenticação de formulários são realçadas em azul. Isso confirma que as informações de cookie deixaram o cliente. Quando você usa uma ferramenta de captura de rede, como o Netmon, você vê o tráfego que realmente passou pelo adaptador.

47 45 54 20 68 74 74 70-3a 2f 2f 6c 6f 63 61 6c   GET http://local
68 6f 73 74 2f 46 6f 72-6d 73 41 75 74 68 4c 6f   host/FormsAuthLo
67 54 65 73 74 2f 57 65-62 46 6f 72 6d 31 2e 61   gTest/WebForm1.a
73 70 78 20 48 54 54 50-2f 31 2e 31 0d 0a 41 63   spx HTTP/1.1..Ac
63 65 70 74 3a 20 69 6d-61 67 65 2f 67 69 66 2c   cept: image/gif,
…Other headers of the GET request…
63 68 65 0d 0a 43 6f 6f-6b 69 65 3a 20 2e 41 53   che..Cookie: .AS
50 58 41 55 54 48 3d 33-43 45 46 39 42 39 41 30   PXAUTH=3CEF9B9A0
43 33 37 41 44 46 36 33-45 36 42 44 33 37 42 36   C37ADF63E6BD37B6
39 43 44 41 32 35 30 30-30 46 38 30 37 32 38 46   9CDA25000F80728F
35 31 43 39 35 36 36 44-31 34 43 35 34 31 34 35   51C9566D14C54145
38 31 43 39 33 45 32 41-30 31 44 44 43 44 45 46   81C93E2A01DDCDEF
32 34 41 31 37 34 32 39-34 31 30 43 30 39 37 34   24A17429410C0974
42 33 45 43 42 30 36 34-32 32 38 45 33 35 33 39   B3ECB064228E3539
39 41 38 32 32 42 33 42-39 33 36 44 46 30 38 46   9A822B3B936DF08F
42 41 42 44 33 45 31 30-32 44 30 30 32 31 30 43   BABD3E102D00210C
32 45 31 33 39 38 30 37-39 42 32 33 35 32 39 46   2E1398079B23529F
34 46 35 44 37 34 41 3b-20 50 72 6f 66 69 6c 65   4F5D74A; Profile
3d 56 69 73 69 74 6f 72-49 64 3d 62 32 34 65 62   =VisitorId=b24eb

Solicitação do lado do servidor

Ao examinar a solicitação que atingiu o servidor, você deseja ter certeza de que o servidor recebeu as mesmas informações enviadas pelo cliente. Se o servidor não recebeu as mesmas informações, você precisará investigar outros dispositivos na rede para determinar onde o cookie foi removido.

Observação Também houve instâncias de filtros ISAPI removendo cookies. Se você confirmar que o servidor Web recebeu o cookie, mas o cookie não estiver listado nos logs do IIS, marcar os filtros ISAPI. Talvez você precise remover os filtros para ver se o problema está resolvido.

O tíquete de autenticação de formulários acaba

A outra causa comum para um usuário ser redirecionado é se o tíquete de autenticação de formulários tiver expirado. O tíquete de autenticação de formulários pode acabar de duas maneiras. O primeiro cenário ocorrerá se você usar a expiração absoluta. Com expiração absoluta, o tíquete de autenticação expira quando o tempo de validade expira. Por exemplo, você define uma expiração de 20 minutos e um usuário visita o site às 14h. O usuário será redirecionado para a página de logon se o usuário visitar o site após as 14h20.

Se você usar a expiração deslizante, o cenário será um pouco mais complicado. O cookie e o tíquete resultante são atualizados se o usuário visitar o site depois que o tempo de validade estiver expirado. Por exemplo, você define uma expiração de 20 minutos usando a expiração deslizante. Um usuário visita o site às 14h e o usuário recebe um cookie que está previsto para expirar às 14h20. A expiração só será atualizada se o usuário visitar o site após as 14h10. Se o usuário visitar o site às 14h09, o tíquete não será atualizado porque metade do tempo de validade não foi passado. Se o usuário aguardar 12 minutos, visitando o site às 14h21, o tíquete expirará. O usuário é redirecionado para a página de logon.

Uma maneira de abordar esse tipo de problema é registrar as informações de cookie e tíquete de autenticação de formulários. Dessa forma, você pode ver se o cookie foi recebido pelo IIS e quais são os valores. Você pode fazer isso escrevendo um HttpModule e conectando esse módulo ao pipeline de solicitação. Você não precisará modificar o código do aplicativo para obter as informações necessárias.

O exemplo anexado funciona no Microsoft .NET Framework 1.1 e no .NET Framework 2.0 e tem comentários por toda parte. O exemplo inclui os seguintes arquivos:

  • FormsAuthEvents.cs: a classe que implementa o IHttpModule e vincula-se ao evento Application_BeginRequest.

  • FormsAuthInfo.cs: a classe que recupera o cookie e descriptografa o tíquete de autenticação de formulários. Ele também verifica o arquivo Web.config do aplicativo para garantir que a autenticação de formulários esteja habilitada.

  • FormsAuthConfig.cs: a classe que lê informações do arquivo FormsAuthLogger.config.

  • Log.cs: o arquivo que aceita um construtor de cadeias de caracteres e grava os valores em um arquivo de log.

  • FormsAuthLogger.config: o arquivo XML lido pelo arquivo Log.cs. Esse arquivo precisa estar na pasta /bin com a DLL construída. O arquivo permite que você configure o seguinte:

    • Filtrar por IP: você pode filtrar a captura de dados por IP do cliente. Dessa forma, você só pode registrar solicitações de um cliente conhecido por reproduzir o problema. Isso reduz o tamanho do log.

    • Tipo de captura: isso especifica onde salvar o arquivo. O padrão é a pasta Temporary ASP.NET Files, mas você pode salvá-lo em qualquer lugar, desde que a conta do processo de trabalho tenha a capacidade de gravar na pasta.

Observe que fornecerei um link de download para o código fornecido no arquivo FormsAuthLogger.zip.

Vou apontar as áreas de main aqui:

  1. Crie uma classe que implemente a interface IHttpModule.

    public class FormsAuthEvents : IHttpModule 
    {
    …code…
    }
  2. Conecte o evento que você deseja examinar. Neste exemplo, estamos usando o evento Application_BeginRequest. Dessa forma, podemos investigar cada solicitação e determinar se ela tem o cookie de autenticação de formulários e registrar o FormsAuthenticationTicket se o cookie estiver lá.

    public void Init(HttpApplication application) 
    {
    //Wire up the BeginRequest event
    application.BeginRequest += (new EventHandler(this.Application_BeginRequest));
    }
  3. Implemente o evento Application_BeginRequest.

    private void Application_BeginRequest(Object source, EventArgs e)
    {
       …code to log the ticket…
    }
    
  4. Recupere o cookie de autenticação de formulários e descriptografe-o.

  5. Registre os valores. Eu recomendaria registrar o seguinte, além das informações de formulários. Isso ajudará você a alinhar suas informações de autenticação de formulários nos logs do IIS, se necessário:

    • Data: permite que você veja quando a solicitação entrou.

    • RequestType: mostra se a solicitação é um Get ou um Post.

    • URL: mostra o padrão de solicitações que levam ao problema.

    • Referrer

    • ClientIP: vincula as solicitações a um cliente específico.

Precisa de mais ajuda?

Quer mais opções

Explore os benefícios da assinatura, procure cursos de treinamento, saiba como proteger seu dispositivo e muito mais.

As comunidades ajudam você a fazer e responder perguntas, fazer comentários e ouvir especialistas com conhecimento avançado.

Essas informações foram úteis?

Qual é o seu grau de satisfação com a qualidade do idioma?
O que afetou sua experiência?
Ao pressionar enviar, seus comentários serão usados para aprimorar os produtos e serviços da Microsoft. Seu administrador de TI poderá coletar esses dados. Política de Privacidade.

Agradecemos seus comentários!

×