O atributo OverrideAuthentication não está funcionando?ASP.NET MVC 5
-
20-12-2019 - |
Pergunta
Tenho um Atributo de Autenticação super simples que estou tentando implementar em uma aplicação ASP.NET MVC 5 e estou tendo alguns problemas.Quero que o atributo seja aplicado globalmente, exceto para ações específicas dentro de um controlador (por exemplo, o formulário de login e a página inicial).
Eu tentei decorar a ação com o [OverrideAuthentication]
atributo sem sorte.Isso me dá um erro de loop de redirecionamento porque o aplicativo ainda está executando a autenticação no formulário de login e continua tentando redirecionar de volta para o formulário de login repetidamente.
Alguém mais viu esse comportamento?Alguma ideia do que coloquei aqui?
A título de exemplo, criei um filtro super simples que ainda não está implementado:
public class BasicAuthenticationAttribute
: ActionFilterAttribute, IAuthenticationFilter
{
public void OnAuthentication(AuthenticationContext filterContext)
{
throw new NotImplementedException();
}
public void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext)
{
throw new NotImplementedException();
}
}
Se eu decorar meu controlador/ação assim:
[BasicAuthentication]
public class AccountController : Controller
{
[HttpGet]
[OverrideAuthentication]
public ActionResult Login()
{
return View();
}
}
Recebo uma exceção não implementada quando navego para a ação Login, mesmo que essa ação não deva estar executando o código de autenticação.Eu entendi mal como as substituições devem funcionar?
Solução
Acho que você confundiu autenticação com autorização (como muitas pessoas fazem).Não faz sentido criar um [BasicAuthenticationAttribute] e registrá-lo globalmente, porque a autenticação só acontece no login, não em todas as solicitações.
Autorização é o que ocorre depois que o usuário faz login para verificar se o usuário tem os privilégios necessários para realizar uma ação específica e faz sentido fazer autorização globalmente.A autorização no MVC é tratada pelo [AuthorizeAttribute] e você pode herdá-lo se precisar personalizar a forma como a verificação de autorização é feita.Você também pode registrá-lo como um filtro global.
O [AllowAnonymousAttribute] funciona em conjunto com [AuthorizeAttribute] e basicamente diz para ignorar a verificação de autorização.Também deve ser observado que [AllowAnonymousAttribute] não terá efeito a menos que seja usado com [AuthorizeAttribute].