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?

Foi útil?

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].

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