Iniciar sessão com a Microsoft
Iniciar sessão ou criar uma conta.
Olá,
Selecione uma conta diferente.
Tem várias contas
Selecione a conta com a qual pretende iniciar sessão.

Coluna de Voz de Suporte do ASP .NET

Resolução de Problemas de Autenticação de Formulários

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

Resolução de Problemas de Autenticação de Formulários

Quando utiliza a Autenticação de Formulários numa aplicação ASP.NET, poderá considerar necessário resolver um problema que ocorre quando o utilizador é redirecionado aleatoriamente para a página de início de sessão. Num mundo ideal, este problema ocorreria de uma forma que lhe permitiria anexar facilmente um depurador e capturar o problema. No entanto, nos ambientes de produção, este é raramente o caso. Para resolver um problema aleatório como este, tem de registar informações relacionadas com o problema para que possa restringir a causa.

Nesta coluna, abordaremos brevemente o conceito de Autenticação de Formulários. Em seguida, vamos ver quais os cenários que levam a que um utilizador seja redirecionado para a página de início de sessão e como capturar dados relevantes para isolar o problema. Também vamos abordar como implementar uma interface IHttpModule para registar as informações de Autenticação de Formulários.

Descrição Geral da Autenticação de Formulários

Quando um utilizador efetua a autenticação num Web site através da Autenticação de Formulários, o servidor cria um cookie. O valor do cookie é um pedido de autenticação de formulários encriptados. O cookie é transmitido para o servidor em cada pedido à aplicação e a classe FormsAuthenticationModule desencripta o valor do cookie e determina se o utilizador é válido ou não.

Por predefinição, a classe FormsAuthenticationModule é adicionada ao ficheiro Machine.config. A classe FormsAuthenticationModule gere o processo FormsAuthentication.

Segue-se uma entrada do ficheiro Machine.config:

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

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

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

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

  3. O cliente envia um HTTP POST para Login.aspx. Inclui as informações de início de sessão.

  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. Isto inclui o cookie de autenticação de formulários.

Para obter mais informações sobre como implementar e utilizar a autenticação de formulários, visite os seguintes Web sites da 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 a partilha de cookies de autenticação de formulários, visite o seguinte site ASP.NET:

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

Motivos pelos quais um utilizador pode ser redirecionado para a página de início de sessão

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

Cenário 1


Neste cenário, um utilizador inicia sessão no Web site. Em algum momento, o cliente envia um pedido para o servidor e o
A classe FormsAuthenticationModule não recebe o cookie. Pode determinar se um pedido de utilizador não contém o cookie ao ativar o registo de cookies no Serviços de Informação Internet da Microsoft (IIS). Para tal, siga estes passos:

  1. Abra a Consola de Gestão da Microsoft (MMC) do IIS.

  2. Clique com o botão direito do rato no Web site e, em seguida, clique em
    Propriedades.

  3. Clique no separador Web Site e, em seguida, clique em Ativar Registo.

  4. Certifique-se de que o formato de registo é Formato de Ficheiro de Registo Expandido W3C.

  5. Clique em Propriedades.

  6. Clique no separador Avançadas e, em seguida, clique em
    Propriedades Expandidas.

  7. Em Propriedades Expandidas, clique para selecionar a caixa de verificação Cookie(cs(Cookie)) e a caixa de verificação Referer (cs(Referer) ).

Após este problema ocorrer, determine qual o cliente que teve o problema e o endereço IP desse cliente. Filtre o início de sessão do IIS no endereço IP desse cliente e veja a coluna <cookie>.

Nota: pode utilizar o Analisador de Registos para analisar os Registos do IIS. Para transferir o Log Parser, visite o seguinte Web site da Microsoft:

http://www.microsoft.com/download/details.aspx?FamilyID=890cd06b-abf8-4c25-91b2-f8d975cf8c07 Depois de ter a lista de pedidos desse utilizador específico, procure os pedidos para a página de início de sessão. Sabe que foram redirecionados para esta página e quer ver os pedidos antes de o redirecionamento ter ocorrido. Se 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 início de sessão inicial.

Método

Página

Resposta

Cookies

GET

/Default.aspx

302 (Redirecionamento)

Sem Cookies

GET

/Login.aspx

200 (Êxito)

Sem Cookies

POST

/Login.aspx

302 (Redirecionamento)

Sem Cookies

GET

/Default.aspx

200 (Êxito)

. ASPXAUTH

GET

/SomePage.aspx

302 (Redirecionamento)

Não, não. ASPXAUTH Cookie

Estes são outros pedidos, seguidos de um pedido para uma página no site sem o . Cookie ASPXAUTH.

Método

Página

Resposta

Cookies

GET

/SomePage.aspx

302 (Redirecionamento)

Não, não. ASPXAUTH Cookie

GET

/Login.aspx

200 (Êxito)

Não, não. ASPXAUTH Cookie

POST

/Login.aspx

302 (Redirecionamento)

Não, não. ASPXAUTH Cookie

GET

/SomePage.aspx

200 (Êxito)

. ASPXAUTH


Nota O primeiro pedido desse utilizador não é susceptível de ter um cookie de autenticação de formulários, a menos que esteja a criar um cookie persistente. O Registo do IIS só lhe mostrará os cookies que foram recebidos no pedido. O primeiro pedido para ter o cookie de autenticação de formulários estará no pedido após uma tentativa de início de sessão bem-sucedida.

Cenário 2


O cookie de autenticação de formulários também pode ser perdido quando o limite de cookies do cliente é excedido. No Microsoft Internet Explorer, existe um limite de 20 cookies. Após a criação do 20.º cookie no cliente, os cookies anteriores são removidos da coleção do cliente. Se o . O cookie ASPXAUTH é removido, o utilizador será redirecionado para a página de início de sessão quando o próximo pedido for processado.

Pode resolver estes dois cenários da mesma forma. Observe o pedido imediatamente antes do redirecionamento para a página de início de sessão. Se o pedido para esta página gerar cookies, será algo a investigar.

Pode utilizar o Fiddler para ver os cabeçalhos HTTP que são enviados para o cliente. Depois de capturar o tráfego, faça duplo clique num pedido e, em seguida, clique em Cabeçalhos para ver o cabeçalho Set-Cookie. Se rastrear um início de sessão com êxito, verá o cabeçalho Set-Cookie na resposta de um início de sessão com êxito.

Para transferir o Fiddler, visite o seguinte web site do Fiddler:

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

Cenário 3


Depois de o pedido sair do cliente, existem várias camadas que podem afetar os pacotes que estão a ser enviados. Para determinar se um dispositivo de rede está a remover o cookie, tem de capturar um rastreio de rede no cliente e no servidor e, em seguida, procurar no corpo do pedido do cookie. Quer ver o pedido do cliente para se certificar de que o cookie foi enviado e verificar o rastreio do servidor para se certificar de que o servidor recebeu o cookie.

Pedido

de cliente Este é um pedido GET depois de o utilizador ter sido autenticado. As informações do pedido de autenticação de formulários estão realçadas a azul. Isto confirma que as informações do cookie deixaram o cliente. Quando utiliza uma ferramenta de captura de rede, como o Netmon, 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

Pedido do lado do servidor

Quando observar o pedido que chegou ao servidor, deve certificar-se de que o servidor recebeu as mesmas informações que o cliente enviou. Se o servidor não tiver recebido as mesmas informações, terá de investigar outros dispositivos na rede para determinar onde o cookie foi removido.

Nota Também houve instâncias de filtros ISAPI a remover cookies. Se confirmar que o servidor Web recebeu o cookie, mas o cookie não estiver listado nos registos do IIS, verifique os filtros ISAPI. Poderá ter de remover os filtros para ver se o problema está resolvido.

O pedido de autenticação de formulários excede o limite de tempo

A outra causa comum para um utilizador ser redirecionado é se o pedido de autenticação de formulários tiver expirado. O pedido de autenticação de formulários pode exceder o limite de tempo de duas formas. O primeiro cenário ocorrerá se utilizar a expiração absoluta. Com a expiração absoluta, o pedido de autenticação expira quando o tempo de expiração expirar. Por exemplo, define uma expiração de 20 minutos e um utilizador visita o site às 14:00. O utilizador será redirecionado para a página de início de sessão se o utilizador visitar o site depois das 14:20.

Se utilizar a expiração deslizante, o cenário é um pouco mais complicado. O cookie e o pedido de suporte resultante são atualizados se o utilizador visitar o site após a expiração ter expirado pela metade. Por exemplo, define uma expiração de 20 minutos com a expiração deslizante. Um utilizador visita o site às 14:00 e o utilizador recebe um cookie que está definido para expirar às 14:20. A expiração só é atualizada se o utilizador visitar o site depois das 14:10. Se o utilizador visitar o site às 14:09, o pedido de suporte não será atualizado porque metade do tempo de expiração não passou. Se o utilizador aguardar 12 minutos, visitar o site às 14:21, o pedido de suporte expirará. O utilizador é redirecionado para a página de início de sessão.

Uma forma de abordar este tipo de problema é registar as informações de cookies e pedidos de suporte de autenticação de formulários. Desta forma, pode ver se o cookie foi recebido pelo IIS e quais são os valores. Pode fazê-lo ao escrever um HttpModule e, em seguida, ligar esse módulo ao pipeline de pedidos. Não terá de modificar o código da aplicação para obter as informações de que precisa.

O exemplo anexado funciona no Microsoft .NET Framework 1.1 e no .NET Framework 2.0 e tem comentários em todo o lado. O exemplo inclui os seguintes ficheiros:

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

  • FormsAuthInfo.cs: a classe que obtém o cookie e desencripta o pedido de autenticação de formulários. Também verifica o ficheiro Web.config da aplicação para garantir que a autenticação de formulários está ativada.

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

  • Log.cs: o ficheiro que aceita um stringbuilder e escreve os valores num ficheiro de registo.

  • FormsAuthLogger.config: o ficheiro XML que é lido pelo ficheiro Log.cs. Este ficheiro tem de estar na pasta /bin com a DLL Incorporada. O ficheiro permite-lhe configurar o seguinte:

    • Filtrar por IP: pode filtrar a captura de dados por IP do cliente. Desta forma, só pode registar pedidos de um cliente que seja conhecido por reproduzir o problema. Isto reduz o tamanho do registo.

    • Tipo de Captura: especifica onde guardar o ficheiro. A predefinição é a pasta Ficheiros ASP.NET Temporários, mas pode guardá-la em qualquer lugar, desde que a conta de processo de trabalho tenha a capacidade de escrever na pasta.

Nota: vou fornecer uma ligação de transferência para o código fornecido no ficheiro FormsAuthLogger.zip.

Vou destacar as áreas principais aqui:

  1. Crie uma classe que implemente a interface IHttpModule.

    public class FormsAuthEvents : IHttpModule 
    {
    …code…
    }
  2. Ligue o evento que pretende ver. Neste exemplo, estamos a utilizar o evento Application_BeginRequest. Desta forma, podemos investigar cada pedido e determinar se tem o cookie de autenticação de formulários e registar 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. Obtenha o cookie de autenticação de formulários e, em seguida, desencripte-o.

  5. Registe os valores. Recomendaria registar o seguinte para além das informações dos formulários. Isto irá ajudá-lo a alinhar as suas informações de autenticação de formulários para os registos do IIS, se necessário:

    • Data: permite-lhe ver quando o pedido foi recebido.

    • RequestType: mostra se o pedido é um Get ou um Post.

    • URL: mostra o padrão dos pedidos que originam o problema.

    • Referenciador

    • ClientIP: ligações nos pedidos a um cliente específico.

Precisa de mais ajuda?

Quer mais opções?

Explore os benefícios da subscrição, navegue em cursos de formação, saiba como proteger o seu dispositivo e muito mais.

As comunidades ajudam-no a colocar e a responder perguntas, a dar feedback e a ouvir especialistas com conhecimentos abrangentes.

Estas informações foram úteis?

Quão satisfeito está com a qualidade do idioma?
O que afetou a sua experiência?
Ao selecionar submeter, o seu feedback será utilizado para melhorar os produtos e serviços da Microsoft. O seu administrador de TI poderá recolher estes dados. Declaração de Privacidade.

Obrigado pelo seu feedback!

×