Autorização e ASP.NET MVC Caching
-
10-07-2019 - |
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?
Solução
Existem duas questões distintas:
- trabalho de autenticação faz com cache no MVC?
- 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.