ASP.NET MVC, IIS 7.5 - Perdendo Sessões Através de Servidores (Load Balanced)

1

Temos um site em execução em três nós da web. Estamos usando o armazenamento de sessão do SQL Server.

Adicionamos recentemente mais dois para descobrir que as sessões dos usuários são perdidas quando são enviadas para uma dessas máquinas.

Verificamos o ID do site, bem como a chave de validação da máquina e a chave de descriptografia.

EDITAR:

Esqueci de mencionar que a máquina em questão era uma versão clonada (VMWare) de uma máquina existente no farm.

Resolvido - nós simplesmente limpamos a nova máquina e levantamos uma nova instalação do Server 08. A causa desse problema ainda era desconhecida.

    
por ItsJason 30.12.2011 / 19:49

2 respostas

1

Você confirmou que a chave da máquina está funcionando? Uma maneira de fazer isso é se você tiver autenticação de formulários, pode ter algumas linhas de código que tentam ler o cookie de autenticação. Se a chave da máquina for inválida, você não poderá ler o cookie e User.Identity.IsAuthenticated será falso. A chave da máquina também é necessária para o estado da sessão SQL, portanto, esse é o principal suspeito.

Algum código de exemplo abaixo.

Se você tiver sua chave em machine.config (em vez de web.config), talvez queira verificar se atualizou o arquivo correto. Se você tiver o .NET 3 e 4, poderá ter um arquivo machine.config em quatro locais. Eu costumo atualizar todos os quatro só para ter certeza.

C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ CONFIG \
C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Config \
C: \ Windows \ Microsoft.NET \ Framework64 \ v2.0.50727 \ Config \
C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Config \

Outra possibilidade remota é que você também queira especificar a propriedade validation="xxxx" para o algoritmo hash de chave de máquina. No .NET4, o algoritmo de hashing padrão é SHA256, mas nas versões anteriores era SHA1. Por isso, geralmente é uma boa ideia incluir isso para que todos sejam iguais.

Quebrar Alterações do ASP.NET 4 - Algoritmo de Hashing Padrão Agora é HMACSHA256

Provedor de configuração protegido. Compartilhar a chave da máquina em um farm da web só funciona com o RsaProtectedConfigurationProvider. Se o web.config ou machine.config especificar apenas o DpapiProtectedConfigurationProvider, ele não funcionará:

Especificando um provedor de configuração protegido
link

Exemplo de código de validação de cookies:

if (Request.Cookies[FormsAuthentication.FormsCookieName] != null)
{
    try
    {
        FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(Request.Cookies[FormsAuthentication.FormsCookieName].Value);
        Debug.WriteLine(String.Format("Cookie timeout: {0}, ticket.Expiration.ToString("yyyy-MMM-dd HH:mm:ss")));
    }
    catch (Exception e)
    { 
        Debug.WriteLine(String.Format("Error reading cookie: {0}", e.ToString()));
    }
}
else
{
    Debug.WriteLine("Cookie unavailable");
}
    
por 31.12.2011 / 05:28
0

Isso provavelmente se deve ao fato de seus novos servidores terem um conjunto de correções diferentes dos antigos. Mesmo quando a chave de validação e a descriptografia são as mesmas, os novos servidores não geram tokens válidos nos antigos. Veja este assunto para precedência .

Provavelmente, você pode resolver isso certificando-se de que todos os servidores estejam totalmente atualizados.

    
por 31.12.2011 / 00:56