Pergunta

Eu decorei meu controlador base com alguns filtros de ação. Eles funcionam bem.

Um desses filtros configura a solicitação - faz coisas como definir a cultura com base no domínio, etc.

Eu também tenho um punhado de ações que exigem autorização usando o atributo Authorize.

Meu problema é que, quando um usuário tenta solicitar uma página que não está autorizada a acessar, o filtro de autorização entra em ação e os redireciona para uma página dizendo a eles que eles não podem disputar a página.

A questão é que os filtros de ação nunca são executados para que a cultura e outros dados de solicitação nunca sejam definidos. Isso efetivamente faz com que a linguagem esteja errada na visualização e em outros dados.

Sei que os filtros de autorização são executados primeiro, mas minha pergunta é a seguinte: como posso projetar isso de modo a garantir que certos métodos sejam sempre executados antes que a visualização seja devolvida, independentemente da autorização.

Espero que isso faça sentido.

Foi útil?

Solução

De acordo com isso documentação (No cabeçalho da ordem do filtro), os filtros de autorização sempre são executados antes dos filtros de ação. Isso significa que mexer com Order Propriedades não ajudarão.

Eu acho que a melhor maneira de lidar com isso é escrever seu próprio atributo de autorização (por subclassificação AuthorizeAttribute e substituindo AuthorizeCore) e executar seus filtros de ação manualmente quando a autorização falhar.

Outras dicas

Ver Ordem de execução para filtros de ação sobre Artigo do MSDN sobre filtro de ação

Basicamente, você pode fornecer um Order propriedade nesses filtros de cultura, para que seja executada antes da O filtro de autorização, algo assim:

[CultureRedirect(Order = 1)]
public class MyBaseController : Controller { }

[Authorize(Order = 2)]
public class RequiresAuth : MyBaseController { }

...

Se isso falhar, você ainda pode Executar o código B antes de uma ação executada e antes que qualquer Filter Action seja executado.

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