Compartilhar via


Visão geral sobre Estado de sessão ASP.NET

Use estado de sessão do ASP.NET para armazenar e recuperar valores para um usuário.

Esse tópico contém:

  • Segundo plano

  • Exemplos de código

  • Referência de Classe

Segundo plano

Estado de sessão ASP.NET permite que você armazene e recupere valores para um usuário enquanto o usuário navega em páginas ASP.NET em um aplicativo da Web.HTTP é um protocolo sem-estado.Isso significa que um servidor Web trata cada solicitação HTTP para uma página como uma solicitação independente.O servidor não retém nenhum conhecimento dos valores de variáveis que foram usados durante solicitações anteriores.O estado de sessão do ASP.NET identifica solicitações do mesmo navegador durante uma janela de tempo limitada como uma sessão, e fornece uma maneira de manter valores de variáveis para a duração dessa sessão.Por padrão, o estado de sessão do ASP.NET é ativado para todos os aplicativos ASP.NET.

Alternativas para estado de sessão incluem o seguinte:

  • O estado do aplicativo, o qual armazena variáveis que podem ser acessadas por todos os usuários de um aplicativo ASP.NET.

  • Propriedades Perfil, que persiste valores em um armazenamento de dados de usuário sem expirá-los.

  • Armazenamento em cache do ASP.NET, que armazena valores na memória que está disponível para todos os aplicativos ASP.NET.

  • Estado de exibição, que persiste valores em uma página.

  • Cookies

  • A sequência de caracteres de consulta e os campos em um formulário HTML que são disponíveis a partir de uma solicitação HTTP.

Para uma comparação das diferentes opções de gerenciamento de estado, consulte Recomendações sobre Gerenciamento de Estado do ASP.NET.

Variáveis de sessão

As variáveis de sessão são armazenadas em um objeto SessionStateItemCollection que é exposto através da propriedade HttpContext.Session.Em uma página ASP.NET, as variáveis de sessão atuais são expostas através da propriedade Session do objeto Page.

A coleção de variáveis de sessão é indexada pelo nome da variável ou por um índice inteiro.Variáveis de sessão são criadas referindo-se à variável de sessão pelo nome.Você não precisa declarar uma variável de sessão ou adicioná-la explicitamente à coleção.O exemplo a seguir mostra como criar variáveis de sessão em um página ASP.NET para o nome e sobrenome de um usuário, e definí-los para valores recuperados de controles TextBox.

Session("FirstName") = FirstNameTextBox.Text
Session("LastName") = LastNameTextBox.Text
Session["FirstName"] = FirstNameTextBox.Text;
Session["LastName"] = LastNameTextBox.Text;

Variáveis de sessão podem ser qualquer tipo .NET Framework válido.O exemplo a seguir armazena um objeto ArrayList em uma variável de sessão denominada StockPicks.O valor retornado pela variável de sessão StockPicks deve ser convertido para o tipo apropriado quando você recupera-lo de SessionStateItemCollection.

' When retrieving an object from session state, cast it to 
' the appropriate type.
Dim stockPicks As ArrayList = CType(Session("StockPicks"), ArrayList)

' Write the modified stock picks list back to session state.
Session("StockPicks") = stockPicks
// When retrieving an object from session state, cast it to 
// the appropriate type.
ArrayList stockPicks = (ArrayList)Session["StockPicks"];

// Write the modified stock picks list back to session state.
Session["StockPicks"] = stockPicks;
Observação:

Quando você usa um modo de estado da sessão que não seja InProc, o tipo da variável de sessão deve ser ou um tipo .NET primitivo ou serializável.Isso ocorre porque o valor da variável de sessão é armazenado em um armazenamento de dados externo.Para obter mais informações, consulte Modos de estado de sessão.

Identificadores de sessão

As sessões são identificadas por um identificador exclusivo que pode ser lido por meio da propriedade SessionID.Quando o estado de sessão é habilitado para um aplicativo ASP.NET, cada solicitação para uma página no aplicativo é examinada para um valor SessionID enviado a partir do navegador.Se nenhum valor SessionID é fornecido, o ASP.NET inicia uma nova sessão e o valor SessionID para a sessão é enviado para o navegador com a resposta.

Por padrão, valores SessionID são armazenados em um cookie.No entanto, você também pode configurar o aplicativo para armazenar valores SessionID na URL para uma sessão "cookieless".

Uma sessão é considerada ativa, desde que as solicitações continuem a ser feitas com o mesmo valor SessionID.Se o tempo entre as solicitações para uma determinada sessão exceder o valor de tempo limite especificado em minutos, a sessão é considerada expirada.As solicitações feitas com um valor SessionID expirado resultam em uma nova sessão.

Observação de segurança:

Valores P:System.Web.SessionState.HttpSessionState.SessionID são enviados em texto não criptografado tanto como um cookie quanto como parte de URL.Um usuário mal-intencionado pode obter acesso à sessão de outro usuário por obter o valor SessionID e incluí-lo nas solicitações ao servidor.Se você estiver armazenando informações sigilosas em estado de sessão, é recomendável que você use criptografia SSL para qualquer comunicação entre o navegador e o servidor que inclua o valor SessionID.

SessionIDs sem-Cookies

Por padrão, o valor SessionID é armazenado em um cookie de sessão não expirável no navegador.No entanto, você pode especificar que os identificadores de sessão não sejam armazenados em um cookie definindo o atributo cookieless como true na seção sessionState do arquivo Web.config.

O exemplo a seguir mostra um arquivo Web.config que configura um aplicativo ASP.NET para usar os identificadores de sessão sem-cookie.

<configuration>
  <system.web>
    <sessionState cookieless="true"
      regenerateExpiredSessionId="true" />
  </system.web>
</configuration>

O ASP.NET mantém estados de sessão sem-cookie automaticamente, inserindo uma sessão exclusiva de identificação para a URL da página.Por exemplo, a URL a seguir foi modificada pelo ASP.NET para incluir a identificação lit3py55t21z5v55vlm25s55 de sessão exclusiva:

http://www.example.com/(S(lit3py55t21z5v55vlm25s55))/orderform.aspx

Quando o ASP.NET envia uma página para o navegador, ela modifica os links na página que usam um caminho relativo de aplicativo, incorporando um valor de identificação de sessão nos links.(Vínculos com caminhos absolutos não são modificados). O estado da sessão é mantido até que o usuário clique em links que foram modificados dessa maneira.No entanto, se o cliente reescreve uma URL que é fornecida pelo aplicativo, o ASP.NET não poderá resolver a identificação da sessão e associar a solicitação com uma sessão existente.Nesse caso, uma nova sessão é iniciada para a solicitação.

A identificação da sessão é incorporada na URL após a barra que segue o nome do aplicativo e antes de qualquer identificador de arquivo ou diretório virtual restante.Isso habilita ao ASP.NET resolver o nome do aplicativo antes que envolva SessionStateModule na solicitação.

Observação:

Para melhorar a segurança do seu aplicativo, você deve permitir que os usuários façam logon fora do seu aplicativo, no ponto em que o aplicativo deve chamar o método Abandon.Isso reduz a possibilidade de um usuário mal-intencionado obter o identificador exclusivo na URL e usá-lo para recuperar dados particulares do usuário armazenados na sessão.

Regenerar Identificadores de Sessão Expirados

Por padrão, os valores de identificação de sessão usados em sessões sem-cookie são reciclados.Isto é, se uma solicitação é feita com uma identificação de sessão que expirou, uma nova sessão é iniciada usando o valor SessionID que é fornecido com a solicitação.Isso pode resultar em uma sessão que está, inadvertidamente, sendo compartilhada quando um link que contém um valor SessionID sem-cookie é usado por vários navegadores.(Isso pode ocorrer se o link é passado através de um mecanismo de pesquisa, por uma mensagem de email ou por outro programa.) Você pode reduzir a chance de dados de sessão serem compartilhados, configurando o aplicativo para não reciclar os identificadores de sessão.Para fazer isso, defina o atributo regenerateExpiredSessionId do elemento de configuração sessionState para true.Isso gera uma nova identificação de sessão quando uma solicitação de sessão sem-cookie é feita com uma identificação de sessão expirada.

Observação:

Se a solicitação que é feita com a identificação da sessão expirada for feita usando o método http POST, quaisquer dados lançados serão perdidos quando regenerateExpiredSessionId é true.Isso ocorre porque o ASP.NET executa um redirecionamento para certificar-se que o navegador tem o novo identificador sessão na URL.

Identificadores de Sessão Personalizados

Você pode implementar uma classe personalizada para fornecer e validar valores SessionID.Para fazer isso, crie uma classe que herda da classe SessionIDManager e substitua os métodos CreateSessionID e Validate com suas próprias implementações.Por exemplo, consulte o exemplo fornecido para o método CreateSessionID.

Você pode substituir a classe SessionIDManager criando uma classe que implemente a interface ISessionIDManager.Por exemplo, você pode ter um aplicativo da Web que associa um identificador exclusivo com páginas não ASP.NET (como páginas HTML ou imagens), usando um filtro ISAPI.Você pode implementar uma classe SessionIDManager personalizada para usar este identificador exclusivo com estado de sessão ASP.NET.Se sua classe personalizada suporta os identificadores de sessão sem-cookie, você deve implementar uma solução para enviar e recuperar identificadores de sessão na URL

Modos de sessão

O estado de sessão do ASP.NET suporta várias opções de armazenamento para variáveis de sessão.Cada opção é identificada como um tipo Mode de estado da sessão.O comportamento padrão é armazenar variáveis de sessão no espaço de memória do processo do operador ASP.NET.No entanto, você também pode especificar que estado de sessão deve ser armazenado em um processo separado, em um banco de dados SQL Server ou em uma fonte de dados personalizada.Se você não quiser estado de sessão habilitado para o seu aplicativo, você pode definir o modo de sessão para Off.

Para obter mais informações, consulte Modos de estado de sessão.

Eventos de sessão

O ASP.NET fornece dois eventos que lhe ajudam a gerenciar sessões de usuário.O evento Session_OnStart é gerado quando uma nova sessão é iniciada, e o evento Session_OnEnd é gerado quando uma sessão é abandonada ou expira.Eventos de sessão são especificados no arquivo Global.asax para um aplicativo ASP.NET.

O evento Session_OnEnd não é suportado se a propriedade Mode da sessão estiver definida como um valor diferente de InProc, o qual é o modo padrão.

Observação:

Se o arquivo Global.asax ou o arquivo Web.config para um aplicativo ASP.NET é modificado, o aplicativo será reiniciado e quaisquer valores armazenados no estado do aplicativo ou estado de sessão serão perdidos.Esteja ciente que alguns softwares de antivírus podem atualizar a data e hora da última alteração do arquivo Global.asax ou Web.config para um aplicativo.

Para obter mais informações, consulte Eventos de Estado de Sessão.

Configurar estado da sessão

O estado de sessão é configurado usando o elemento sessionState da seção de configuração system.web .You can also configure session state by using the EnableSessionState value in the @ Page directive.

O elemento sessionState permite que você especifique as seguintes opções:

  • O modo no qual a sessão irá armazenar dados.

  • A maneira na qual valores de identificador de sessão são enviados entre o cliente e o servidor.

  • O valor Timeout da sessão.

  • Suporte a valores que são baseados na configuração Mode da sessão.

O exemplo a seguir mostra um elemento sessionState que configura um aplicativo para modo de sessão SQLServer.Ele define o valor Timeout para 30 minutos e especifica que os identificadores de sessão sejam armazenados na URL.

<sessionState mode="SQLServer"
  cookieless="true "
  regenerateExpiredSessionId="true "
  timeout="30"
  sqlConnectionString="Data Source=MySqlServer;Integrated Security=SSPI;"
  stateNetworkTimeout="30"/>

Você pode desativar estado de sessão para um aplicativo, definindo o modo de estado da sessão para Off.If you want to disable session state for only a particular page of an application, you can set the EnableSessionState value in the @ Page directive to false.O valor EnableSessionState também pode ser definido como ReadOnly para fornecer acesso somente de leitura a variáveis de sessão.

Solicitações simultâneas e estado de sessão

O acesso a estado de sessão do ASP.NET é exclusivo por sessão, o que significa que se dois usuários diferentes fizerem solicitações simultâneas, o acesso a cada sessão separada será concedido simultaneamente.No entanto, se duas solicitações simultâneas são feitas para a mesma sessão (usando o mesmo valor SessionID), a primeira solicitação obtém acesso exclusivo às informações de sessão.A segunda solicitação executa somente após a conclusão da primeira solicitação.(A segunda sessão também pode obter acesso se o bloqueio exclusivo de informações é liberado porque a primeira solicitação excedeu o tempo limite de bloqueio.) If the EnableSessionState value in the @ Page directive is set to ReadOnly, a request for the read-only session information does not result in an exclusive lock on the session data.No entanto, solicitações somente leitura para os dados da sessão pode ainda ter que aguardar um bloqueio definido por uma solicitação de leitura-gravação de dados da sessão para limpar.

Voltar ao topo

Exemplos de código

Como: Salvar valores no estado de sessão

Como: Ler valores de estado de sessão

Implementar um Provedor de Armazenamento de Estado da Sessão

Voltar ao topo

Referência de Classe

A seguinte tabela lista classes chave relacionadas ao estado de sessão que estão no namespace System.Web.SessionState.

Membro

Descrição

SessionIDManager

Gerencia identificadores exclusivos para estado de sessão do ASP.NET.

SessionStateItemCollection

Usado para armazenar variáveis de estado de sessão.

Voltar ao topo

Consulte também

Conceitos

Implementar um Provedor de Armazenamento de Estado da Sessão