Qual é a melhor maneira de fazer um redirecionamento em um ActionFilterAttribute
. Eu tenho um ActionFilterAttribute
chamado IsAuthenticatedAttributeFilter
e que verificou o valor de uma variável de sessão. Se a variável for falsa, desejo que o aplicativo seja redirecionado para a página de login. Eu preferiria redirecionar usando o nome da rota, SystemLogin
no entanto, qualquer método de redirecionamento neste momento seria bom.
c#
asp.net-mvc
asp.net-mvc-3
redirect
routes
ryanzec
fonte
fonte
Respostas:
Definir filterContext.Result
Com o nome da rota:
Você também pode fazer algo como:
Se você deseja usar
RedirectToAction
:Você pode criar um
RedirectToAction
método público no seu controlador (de preferência no controlador base ) que simplesmente chama o protegidoRedirectToAction
deSystem.Web.Mvc.Controller
. A adição deste método permite uma chamada pública para você aRedirectToAction
partir do filtro.Em seguida, seu filtro seria algo como:
fonte
protected
para que você não tenha acesso a ele a partir do filtro.protected
Deve haver alguma explicação razoável? Eu me sinto muito sujo redefinindo essa acessibilidadeRedirectToAction
sem entender por que ela foi encapsulada em primeiro lugar.Como alternativa a um redirecionamento, se estiver chamando seu próprio código, você pode usar o seguinte:
Não é um redirecionamento puro, mas fornece um resultado semelhante sem sobrecarga desnecessária.
fonte
actionContext.Result.ExecuteResult
de dentro do seu filtro de ação - o MVC fará isso automaticamente após a execução do filtro de ação (desde queactionContext.Result
não seja nulo).Estou usando o MVC4, usei a seguinte abordagem para redirecionar uma tela html personalizada após violação da autorização.
Estender
AuthorizeAttribute
dizerCutomAuthorizer
substituir oOnAuthorization
eHandleUnauthorizedRequest
Registre o
CustomAuthorizer
noRegisterGlobalFilters
.ao identificar a
unAuthorized
chamada de acessoHandleUnauthorizedRequest
e redirecionar para a ação do controlador em questão, como mostrado abaixo.fonte
Parece que você deseja reimplementar ou possivelmente estender
AuthorizeAttribute
. Em caso afirmativo, você deve herdar isso, e nãoActionFilterAttribute
, para permitir que o ASP.NET MVC faça mais do seu trabalho.Além disso, você deseja certificar-se de autorizar antes de executar qualquer trabalho real no método de ação - caso contrário, a única diferença entre logado e não será a página exibida quando o trabalho for concluído.
Há uma boa pergunta com uma resposta com mais detalhes aqui no SO.
fonte
Experimente o seguinte trecho, deve ficar bem claro:
fonte
Aqui está uma solução que também leva em consideração se você estiver usando solicitações do Ajax.
fonte
Isso funciona para mim (asp.net core 2.1)
fonte
você pode herdar seu controlador e usá-lo dentro do seu filtro de ação
dentro de sua classe ActionFilterAttribute:
dentro do seu controlador de base:
Cons. disso é alterar todos os controladores para herdar da classe "MyController"
fonte