O uso de cookies para armazenar sessão no ASP MVC
-
22-07-2019 - |
Pergunta
Armazenar toda a sessão em um cookie tem sido padrão em Rails para os últimos anos? - há uma maneira fácil de conseguir algo semelhante com ASP MVC
Por padrão, qualquer coisa em Sessão / TempData é armazenado na memória no servidor. Em web.config isso pode ser alterado para um cache SQL Store / server-side. Eu gostaria de ser capaz de ter esses objetos persistiu em um cookie.
Parece que eu poderia implementar um costume Provider Session-State Store. Existe uma abordagem mais simples?
Solução
sim, implementar um estado personalizado sessão do provedor . E não, afaik não há uma abordagem mais simples.
Ps. não é tão ruim quanto parece ie> metade do ODBC amostra está escrevendo para o db.
Outras dicas
Eu acho que seria muito mais eficiente para apenas armazenar o ID da sessão (um hash ou qualquer outro) no cookie, e depois usar essa ID para obter os dados da sessão a partir da memória / banco de dados / whatever de armazenamento que você preferir. Manter o estado da sessão completa em um cookie aumentos de largura de banda innecessarily.
Além disso, manter a segurança em mente: se o cookie contém informações de autenticação ou outros dados sensíveis e você não tiver cuidado, ele pode facilmente ser cortado pelo usuário para obter privilégios ou não mexer com a sua aplicação (criptografar os dados suga demasiado , porque então você tem que base-64 codificar os dados criptografados, o que mais desperdiça largura de banda e tempo de processamento). Você deve não de entrada confiança do usuário.
Eu fortemente desencorajar armazenar toda a sessão em cookies. Tem implicações mau desempenho. Considere o seguinte: cada pedido (para todos os recursos) irá conter uma sobrecarga de dados possivelmente obsoletos que você só precisa de uma ou duas vezes. Eventualmente, essa sobrecarga vai bater seus usuários, a sua largura de banda e seu desempenho do site.
Aqui está um exemplo:
GET / HTTP/1.1
Host: localhost
OtherUsefulHeaders: foo
Cookie: YourSessionState=...
tamanho do pedido inicial é de cerca de 200 bytes. Vamos dizer, você adicionar cerca de 100 bytes para sua sessão. Agora, a dimensão é de 300 bytes e a sobrecarga é ~ 30%. Você pode adicionar mais 100 bytes, e a sobrecarga é de 50%. O que significa que aproximadamente requer tempo 2x para enviar o pedido e 2x largura de banda.
Você deve, antes, olhar para baseada em cookie TempData implementação, pois tem muito menor pegada e realmente faz sentido.
Eu recomendo armazenar TempData
no cookie (em oposição a toda a sessão).
Para armazenar TempData
no cookie, você precisará substituir ITempDataProvider
e implementar seu próprio provedor personalizado.
Há realmente um pacote NuGet disponível (que faz isso implementação personalizada para você): BrockAllen.CookieTempData e aqui é a documentação . A coisa boa sobre este pacote é que ele tanto compressa e criptografa seu TempData
, assim você não precisa se preocupar com o envio de texto simples através da Internet.
Tudo que você precisa fazer é instalar o pacote NuGet e depois substituir CreateTempDataProvider
em sua classe ControllerBase
:
using BrockAllen.CookieTempData;
namespace myProject.web.Controllers
{
public class ControllerBase : Controller
{
// use CookieTempDataProvider instead of default provider
protected override ITempDataProvider CreateTempDataProvider()
{
return new CookieTempDataProvider();
}
}
}
Você não deve usar Sessões para isso, mas Profiles vez. Perfis usar cookies para coincidir com computadores para perfis, etc. A chave perfil é armazenado em um cookie, e não é perdido quando fechar o navegador etc.
Info aqui; http://odetocode.com/articles/440.aspx
depende de que tipo de dados que você deseja armazenar no cookie, se você quiser apenas para string loja, o seguinte código vai fazer:
HttpCookie cookie = new HttpCookie("username","sth");
cookie.HttpOnly = true;
cookie.Expires = DateTime.Now.AddMonths(3);
HttpContext.Current.Response.Cookies.Add(cookie);