Pergunta

Estou criando um HttpCookie, definindo apenas o nome e o valor e não a propriedade expires, e depois adicionando-o à resposta.Simples o suficiente.O cookie é criado (mas não persistido) conforme esperado.O problema é que quando a sessão muda por algum motivo (como o site foi reconstruído ou eu reconstruí meu aplicativo durante a depuração), o cookie permanece ativo.Quero que o cookie seja válido apenas para a sessão original em que foi criado.

De acordo com o MSDN diz:"Se você não especificar um limite de expiração para o cookie, o cookie não será persistido no computador cliente e expirará quando a sessão do usuário expirar."

Acho que não sei exatamente o que significa "a sessão expira".Acho que o cookie é excluído após 20 minutos quando a sessão expira.Mas o cookie deveria ser excluído se a sessão em que foi criado não existir mais por vários motivos?A única vez que vi o cookie ser excluído foi quando o usuário fecha todas as janelas do navegador e abre uma nova.

Se tudo isso for verdade, talvez seja necessário armazenar o ID da sessão original ("ASP.NET_SessionId") no cookie e, em seguida, compará-lo com o ID da sessão atual, se forem diferentes, exclua o cookie ou crie um novo. .

Aqui está o código (a única diferença entre meu cookie e aquele nos exemplos do MSDN é que estou armazenando vários valores no cookie):

private void SaveValuesToCookie(string[] names, string[] values)
{
    HttpCookie cookie = new HttpCookie("MyCookie");

    for (int i = 0; i < names.Length; i++)
    {
        string name = names[i];
        cookie.Values[name] = values[i];
    }
    Response.Cookies.Add(cookie);
}

private string GetValueFromCookie(string name)
{
    HttpCookie cookie = Request.Cookies["MyCookie"];
    if (cookie == null)
        return null;

    return cookie.Values[name];
}
Foi útil?

Solução

A única vez que vi o cookie ser excluído é quando o usuário fecha todas as janelas do navegador e abre um novo.

E é exatamente isso que o MSDN quer dizer quando diz que o cookie será excluído quando a sessão expirar.Infelizmente, acredito que isso não seja consistente entre os navegadores, por isso não é muito útil para ninguém.

Você deve sempre definir uma data de validade para os Cookies.

Se tudo isso for verdade, talvez eu precise armazenar o ID da sessão original ("asp.net_sessionid") no cookie e verifique -o no ID da sessão atual, se forem diferentes, exclua o cookie ou crie um novo .

Odeio dizer isso, mas isso também não vai ajudar você.O .NET Framework gosta de reciclar IDs de sessão, então você não pode garantir que será diferente.

Más notícias, aconselho você a reconsiderar o que está tentando fazer do ponto de vista arquitetônico.

Reiniciar o aplicativo é algo que acontece inteiramente no servidor;cookies são algo que acontece inteiramente no cliente.Embora o cliente converse com o servidor, é puramente um relacionamento de solicitação/resposta, o servidor não pode comunicar eventos como a reinicialização de um aplicativo ao navegador.

Se você deseja armazenar um valor em algum lugar que seja válido apenas durante a vida útil de uma sessão do servidor, por que não armazená-lo em Sessão em vez de em um Cookie?

Outras dicas

Estou ciente de tudo isso, mas não é seguro o suficiente para as necessidades de nossos clientes.A sessão ainda pode ser falsificada ou injetada.Ver: http://msdn.microsoft.com/en-us/magazine/cc163730.aspx#S9

Parece que preciso criar um cookie seguro expirado separado da sessão e atualizar a data de expiração quando puder (ou seja, quando o usuário acessar determinadas páginas).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top