ActionFilter em Ação: Segurança nos métodos

Mai 24th, 2008 | By Juliano Oliveira | Category: .net, asp.net, asp.net mvc, microsoft

E ae galera, depois de um tempo sem post decidi escrever sobre um recurso bem legal do ASP.NET MVC Framework, um dos novos eventos de ActionFilters que foram liberados na última revisão. São eles:

  • OnActionExecuting que ocorre antes do método ser chamado;
  • OnActionExecuted que ocorre após o método ser chamado, mas antes do resultado;
  • OnResultExecuting que ocorre antes do resultado;
  • OnResultExecuted que ocorre após o resultado.

No exemplo, veremos o poder do evento OnActionExecuting onde antes de qualquer método que definirmos, ser necessário estar logado, nós “testaremos” se o usuário está ou não logado no sistema. O interessante neste recurso é a facilidade para definirmos esta regra aos métodos através de atributos, definidos na declaração dos métodos. Vejam essa classe:


public class RequiresAuthenticationAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(FilterExecutingContext filterContext)
{
if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
string redirectOnSuccess = filterContext.HttpContext.Request.Url.AbsolutePath;

string redirectUrl = string.Format("?ReturnaUrl=~{0}", redirectOnSuccess);
string loginUrl = FormsAuthentication.LoginUrl + redirectUrl;
filterContext.HttpContext.Response.Redirect(loginUrl, true);
}
}
}

Basicamente, tá pronto :)

Só com essa classe bem simples já podemos definir métodos que necessitem que o usuário esteja logado no sistema. Lá na declaração da classe vemos que estamos criando uma classe herdada de ActionFilterAttribute, portanto, estamos criando um novo atributo chamado RequiresAuthentication. O código é bem simples: Se filterContext.HttpContext.User.Identity.IsAuthenticated for falso redireciona para a página de login e de quebra, manda também a página que o pelego tentou acessar para depois de logado redirecionar para ela novamente.

Para termos um código de fácil manutenção, setamos no web.config a rota de redirecionamento (FormsAuthentication.LoginUrl).


<system.web>
<authentication mode="Forms">
<forms loginUrl="/Home.mvc.aspx/Login" />
</authentication>
</system.web>

E pronto, agora qualquer método será facil de implementarmos necessidade de autenticação.


public class HomeController : Controller
{
public void Index()
{
RenderView("Index");
}

[RequiresAuthentication]
public void Post()
{
RenderView("Post");
}
}

Bem legal né, com um simples [RequiresAuthentication] mudamos todo um escopo de um método!

Para autenticar o usuário, crie uma View com um Form pedindo usuário e senha e redirecione para um método de Autenticação, faça o beabá para verificar se usuário e senha estão corretos depois é só autenticar o usuário assim:


public void Autenticar(string usuario, string senha, string RetornaUrl)
{
//TODO: Verifica se esta logado ou não
if(!UsuarioLogado)
{
// O rememberMe é para persistir ou não o Cookie
FormsAuthentication.SetAuthCookie(usuario, rememberMe);
RedirectToAction(RetornaUrl)
}
else
{
TempData["MensagemDeLogin"] = "Login incorreto";
RedirectToAction("Login");
}
}

Até o próximo post!

Fonte: ASP.NET MVC: Securing Your Controller Actions

[]´s

Tags: , , ,

One comment
Escrever um comentário »

  1. boa Juliano, caiu como uma luva no projeto piloto que to fazendo com ASP.Net MVC … /

Escrever um comentário