Pergunta

Estou confuso sobre ASP.NET MVC cache e autorização e na extrema necessidade de algum esclarecimento.

As minhas herda atributos autorização self-made de AuthorizeAttribute. Seu método AuthorizeCore substituído passa a cada momento, mesmo se eu definir um atributo [OutputCache] em uma ação do controlador. Eu entendo que parte.

Agora, o bender mente para mim: AuthorizeCore irá falha toda vez que agora, quando eu realmente fazer o cache de saída ea página é servido a partir do cache. A razão é que quando o pedido é armazenado em cache, o httpContext.Session fornecido com AuthorizeCore é null !? Aqui está um código simplificado:

protected override bool AuthorizeCore(HttpContextBase httpContext) {
    return (Session["userId"] != null)
}

Então, se httpContext.Session é null, isto obviamente não todas as vezes. Eu preciso acessar a sessão, porém, de que outra forma posso verificar se o pedido for autorizado? Isso não faz qualquer sentido - se é assim que deve ser, então eu iria não ser capaz de usar páginas em cache em conjunto com a autenticação no ASP.NET MVC. Ajuda?

Foi útil?

Solução

Existem duas questões distintas:

  1. trabalho de autenticação faz com cache no MVC?
  2. A sessão de trabalho antes da autenticação em face de um cache (mesmo para usuários não autenticados, que ainda tem uma sessão espero único)?

As respostas, respectivamente, são sim e não. Autenticação funciona bem com o cache. Experimente-o com os provedores de associação SQL ou de domínio; você vai ver.

Cache, no entanto, pode ser executado antes de o módulo de autenticação. (Para os pontos de bônus:? Por) Authentication é chamado apenas se especificamente conecta o cache (como AuthorizeAttribute faz). Porque as sessões são específicas do usuário, há não garanto que você vai ter um dentro de sessão de AuthorizeCore.

Mais pontos de bônus:? Como pode esta mudança se você especificou varyByUser em sua configuração de cache

Infelizmente, fazendo a autenticação direito é difícil, porque fazer qualquer tipo de direito de segurança é difícil. Microsoft tenta fazer isso mais fácil com a API do provedor de associação. Eu recomendo fortemente usando esse ao implementar autenticação personalizada. Eu também recomendo usar o built-in fornecedores e estendê-los em vez de reescrevê-los sempre que possível.

Um outro ponto: O provedor de sessão ASP.NET eo provedor ASP.NET Membership são inteiramente separado. Diferentes usuários associados podem compartilhar (!) Uma sessão, e, sim , você pode ataque um site assim. É não seguro para colocar informações relacionadas à segurança em uma sessão. Segurança é difícil.

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