ASP .NET MVC 5 - Usando Authentication Filters


  Neste tutorial vou mostrar como usar o novo recurso da ASP .NET MVC 5 chamado Authentication Filter.
 

Chegou o curso Curso ASP .NET .MVC 5 Vídeo Aulas onde você vai aprender a criar aplicações web dinâmicas usando a ASP .NET MVC 5.

Os Action Filters são atributos que podem ser aplicados a um método Action ou a um controlador e que modifica a maneira na qual a Action é executada.

Atualmente tempos 5 tipos possíveis de filtro na ASP .NET MVC  :

Podemos aplicar mais de um Filtro a um método Action ou a um controlador.

Neste caso a ordem de execução do filtros é  a seguinte : Authentication -> Authorization -> Action -> Result ->  Exception

A sintaxe usada usa o nome do atributo entre colchetes acima do nome da Action ou do controlador:

[NomeDoAtributo(Parametro = Valor)]
public ActionResult ActionMethod()
{
    
//implementacao
}

Exemplo:

[Authorize]
public class  ContaController : Controller
{
    [AllowAnonymous]
    [OutputCache(Duration=20)]    
    public ActionResult Login()
    {
         return View();
    }
}

 

Dessa forma os filtros de autenticação são um novo tipo de filtro na ASP.NET MVC 5 que executam antes de filtros de autorização no pipeline ASP.NET MVC e permitem que você especifique a lógica de autenticação por Action, controlador, ou globalmente para todos os controladores.

Os filtros de autenticação processam credenciais no request e apresentam um principal correspondente podendo também adicionar desafios de autenticação em resposta a pedidos não autorizados.

A razão básica para a introdução dos filtros de autenticação é separar a autenticação da autorização (autenticação em primeiro lugar, em seguida, autorização):

- Na autenticação é estabelecido um principal para o request atual;
- Na autorização é verificada se o objeto atual tem permissão para executar o request atual;


Podemos usar a interface IAuthenticationFilter (System.Web.Mvc.Filters) para criar um filtro de autenticação personalizado.

 

A seguir temos a definição de IAuthenticationFilter:

 

public interface IAuthenticationFilter
  {
    void OnAuthentication(AuthenticationContext filterContext);
    void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext);
  }

 

Essa Interface fornece dois métodos:

OnAuthentication (AuthenticationContext filterContext)
Este método é usado para autenticar o pedido e fornece o contexto a ser usado para autenticação.

OnAuthenticationChallenge (AuthenticationChallengeContext filterContext)
Este método adiciona um desafio de autenticação para o ActionResult atual e fornece o contexto para usar para o desafio de autenticação.

 

Neste artigo vou mostrar como implementar um filtro de autenticação customizado que simplesmente irá redirecionar o usuário de volta à página de login se ele não estiver autenticado.

 

Recursos usados :

Abra o VS 2013 Express for web e clique em New Project;

A seguir selecione Visual C# -> ASP .NET Web Application;

Informe o nome Mvc_Autenticacao e clique no botão OK;

A seguir selecione o template MVC, marque MVC  e clique no botão OK;

Será criado um projeto contendo toda a estrutura de pastas criadas pelo framework ASP .NET MVC com autenticação e segurança padrão definidas.

Se executarmos a aplicação iremos perceber que ela vai funcionar sem precisar alterar nenhuma linha de código.

Eu vou alterar alguns textos nos arquivos /Views/Shared/_Layout.cshtml e /Views/Shared/_LoginPartial.html para exibir uma tela de apresentação menos poluída conforme podemos ver abaixo após executar o projeto:

Ao clicar no link - Logar - veremos a tela de login apresentada conforme a figura abaixo:

Muito bem...

Vamos agora criar uma nova pasta em nosso projeto chamada Atributos.

Clique no menu PROJECT e a seguir em New Folder e informe o nome Atributos;

A seguir crie uma classe nesta pasta chamada MinhaAutenticacao herdando de ActionFilterAttribute e de IAuthenticationFilter.

Clique com o botão direito sobre a pasta e a seguir em Add -> Class;

Ao definir o código da classe

 public class MinhaAutenticacao : ActionFilterAttribute, IAuthenticationFilter
    {
        public void OnAuthentication(AuthenticationContext filterContext)
        {
            throw new NotImplementedException();
        }
        public void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext)
        {
            throw new NotImplementedException();
        }
    }
 

A interface IAuthenticationFilter define dois métodos : OnAuthentication e OnAuthenticationChallenge.

O primeiro é executado primeiro e pode ser usado para realizar qualquer autenticação que se faça necessária.

O segundo é usado para restringir o acesso baseado na autenticação do usuário principal.

Para esse nosso exemplo vou implementar somente o método OnAuthenticationChallenge deixando o outro método em branco para você exercitar.

A classe AuthenticationChallengeContext representa um contexto de desafio de autenticação contendo informações para executar um desafio de autenticação.

Dessa forma o código completo da nossa implementação deve ficar assim:

using System.Web.Mvc;
using System.Web.Mvc.Filters;
namespace VSMMvc5AuthFilterDemo.CustomAttributes
{
    public class MinhaAutenticacao : ActionFilterAttribute, IAuthenticationFilter
    {
        public void OnAuthentication(AuthenticationContext filterContext)
        {
              //deixar em branco
        }
        public void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext)
        {
            var usuario = filterContext.HttpContext.User;
            if (usuario == null || !usuaruio.Identity.IsAuthenticated)
            {
                filterContext.Result = new HttpUnauthorizedResult();
            }
        }
    }
}

Nossa implementação é bem simples (ingênua mesmo...) e obtém o usuário do contexto HTTP da aplicação em execução e verifica se o mesmo esta autenticado. Se não estiver ele será redirecionado para a página de login.

Agora é só alegria...

Já podemos testar nossa autenticação aplicando o atributo ao controlador HomeController da nossa aplicação.

Lembrando que ao aplicar o atributo ao controlador, todos os métodos Action irão herdar o atributo e o mesmo atuará em todos os métodos Action.

Abra o arquivo HomeController na pasta Controllers e inclua o código, destacado em azul, conforme mostrado abaixo:

using System.Web.Mvc;
using Mvc_Autenticacao.Atributos;
namespace Mvc_Autenticacao.Controllers
{
    [MinhaAutenticacao]
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }
        public ActionResult About()
        {
            ViewBag.Message = "Macoratti .net";
            return View();
        }
        public ActionResult Contact()
        {
            ViewBag.Message = "http://www.macoratti.net";
            return View();
        }
    }
}

Agora vamos rodar a nossa aplicação e verificar o seu comportamento:

Conforme era esperado fomos direcionados para a página de login.

Para acessar a página principal basta se registrar.

Como você percebeu não é muito difícil implementar um filtro de autenticação com ASP .NET MVC 5.

Pegue o projeto completo aqui : Mvc_Autenticacao.zip

Em verdade, em verdade vos digo que vem a hora, e agora é, em que os mortos ouvirão a voz do Filho de Deus, e os que a ouvirem viverão.
Porque, como o Pai tem a vida em si mesmo, assim deu também ao Filho ter a vida em si mesmo;
E deu-lhe o poder de exercer o juízo, porque é o Filho do homem
João 5:25-27

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

 

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti