none
Como criar um Data Annotation para Controller RRS feed

  • Pergunta

  • Boa tarde.

    A minha situação é a seguinte; Quando o usuário faz o login na AccountController ele escolhe uma empresa em que deseja fazer o login, e então eu armazeno em uma Session a entidade relacionada a empresa.

    Como eu crio uma annotation para obrigar a esta Session["Empresa"] sempre estar preenchida? e caso não esteja, o usuário deve ser redirecionado a página para escolher a empresa. Não quero fazer isso dentro do código da Action, quero implementar uma funcionalidade mais elegante.

    Quero fazer algo que funcione da mesma forma como o [Authorize] que coloco nos controllers.

    Obrigado.

    terça-feira, 16 de julho de 2013 19:54

Respostas

  • É que no meu exemplo eu tenho uma classe estática pegando a session que está assim :

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.SessionState;
    
    namespace MvcTeste.Areas.AdmEmpresa.Models
    {
        public static class EmpresaSession
        {
            public static EmpresaConta Empresa
            {
                get
                {
                    HttpSessionState Sessao = HttpContext.Current.Session;
                    return (EmpresaConta)((IsAutenticado) ? Sessao["EmpresaUsuario"] : null);
                }
            }
    
            public static bool IsAutenticado
            {
                get
                {
                    HttpSessionState Sessao = HttpContext.Current.Session;
                    return Sessao["EmpresaUsuario"] != null;
                }
            }
    
    
        }
    }

    Daí é claro que para criar a session inicial você teria algum metodo de autenticação algo assim :

    public ActionResult ValidarUser(UsuarioEmpresa User)
    {
    
    
    var ExisteUser = Contexto.UsuarioEmpresa.ToList().Where(n => n.Login == User.Login && n.Senha == User.Senha).FirstOrDefault();
    
    
    if(ExisteUser != null)
    {
    
    Session["
    EmpresaUsuario
    "] = ExisteUser;
    return View("Acesso");
    }
    else
    {
    
    
    return View("Index");
    }
    
    
    }

    Esse exemplo acima é somente para você ter uma base de como fazer. Se lhe foi util marque como resposta.


    Davi Murilo Referência Principal : Jesus que ilumina minha mente.
    Referência Profissonal : http://www.tidm.com.br


    terça-feira, 16 de julho de 2013 20:38

Todas as Respostas

  • Boa tarde , basta criar uma classe herdando a  classe   AuthorizeAttribute após isso basta sobreescrever o metodo autorizando segue um exemplo que criei :

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    
    namespace MvcTeste.Areas.AdmEmpresa.Models
    {
        public class PermissaoEmpresa : AuthorizeAttribute
        {
            private int Painel = 0;
    
            public PermissaoEmpresa()
            {
    
            }
    
            public PermissaoEmpresa(int IdPainel)
            {
                Painel = IdPainel;
            }
    
    
            public override void OnAuthorization(AuthorizationContext filterContext)
            {
    
                if (!EmpresaSession.IsAutenticado)
                {
                    filterContext.Result = new RedirectToRouteResult(new System.Web.Routing.RouteValueDictionary()
                    {
                       {"controller","AdmEmpresa"},
                       {"action","Index"}
                    });
                }
                else if(Painel > 0)
                {
                    ContextoPermissao QueryPermissao = new ContextoPermissao();
                    var Lista = QueryPermissao.ListaPermissao(EmpresaSession.Empresa.IdGrupoConta, Painel);
                    string Permissao = "N";
    
                    if (Lista.Count > 0)
                    {
                        switch(Painel)
                        {
    
                            case((int)EnumPainel.CadastroUsuario) :
                                Permissao = QueryPermissao.ListaPermissao(EmpresaSession.Empresa.IdGrupoConta, Painel)[0].Inclusao;
                            break;
                            case ((int)EnumPainel.CadastroVaga):
                            Permissao = QueryPermissao.ListaPermissao(EmpresaSession.Empresa.IdGrupoConta, Painel)[0].Inclusao;
                            break;
                            case ((int)EnumPainel.FiltroUsuario):
                            Permissao = QueryPermissao.ListaPermissao(EmpresaSession.Empresa.IdGrupoConta, Painel)[0].Exibicao;
                            break;
                            case ((int)EnumPainel.FiltroVaga):
                            Permissao = QueryPermissao.ListaPermissao(EmpresaSession.Empresa.IdGrupoConta, Painel)[0].Exibicao;
                            break;
                        }
                    }
                    
    
                    if (Permissao.Equals("N"))
                    {
                        filterContext.Result = new RedirectToRouteResult(new System.Web.Routing.RouteValueDictionary()
                        {
                            {"controller","AdmEmpresa"},
                            {"action","HomeEmpresaAdm"}
                        });
                    
                    }
    
                }
                
                //base.OnAuthorization(filterContext);
            }
    
        }
    }

    Após isso lá nos controles você decora acima da classe do controller ou dos metodos da seguinte maneira 

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using MvcTeste.Areas.AdmEmpresa.Models;
    
    namespace MvcTeste.Areas.AdmEmpresa.Controllers
    {
        [PermissaoEmpresa]
        public class VagaEmpresaController : Controller
        {
            //
            // GET: /AdmCliente/Vaga/
    
            public ActionResult Index()
            {
                return View();
            }
    
    }
    
    
    }

    No meu exemplo estou usando areas mas isso não é necessário para o seu objetivo.


    Davi Murilo Referência Principal : Jesus que ilumina minha mente.
    Referência Profissonal : http://www.tidm.com.br

    terça-feira, 16 de julho de 2013 20:04
  • Muito obrigado pela ajuda!

    Mas em que momento, e também como, eu pego o valor da Session["Empresa"]. Quando tento utilizar esta variável não reconhece oO.

    terça-feira, 16 de julho de 2013 20:24
  • É que no meu exemplo eu tenho uma classe estática pegando a session que está assim :

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.SessionState;
    
    namespace MvcTeste.Areas.AdmEmpresa.Models
    {
        public static class EmpresaSession
        {
            public static EmpresaConta Empresa
            {
                get
                {
                    HttpSessionState Sessao = HttpContext.Current.Session;
                    return (EmpresaConta)((IsAutenticado) ? Sessao["EmpresaUsuario"] : null);
                }
            }
    
            public static bool IsAutenticado
            {
                get
                {
                    HttpSessionState Sessao = HttpContext.Current.Session;
                    return Sessao["EmpresaUsuario"] != null;
                }
            }
    
    
        }
    }

    Daí é claro que para criar a session inicial você teria algum metodo de autenticação algo assim :

    public ActionResult ValidarUser(UsuarioEmpresa User)
    {
    
    
    var ExisteUser = Contexto.UsuarioEmpresa.ToList().Where(n => n.Login == User.Login && n.Senha == User.Senha).FirstOrDefault();
    
    
    if(ExisteUser != null)
    {
    
    Session["
    EmpresaUsuario
    "] = ExisteUser;
    return View("Acesso");
    }
    else
    {
    
    
    return View("Index");
    }
    
    
    }

    Esse exemplo acima é somente para você ter uma base de como fazer. Se lhe foi util marque como resposta.


    Davi Murilo Referência Principal : Jesus que ilumina minha mente.
    Referência Profissonal : http://www.tidm.com.br


    terça-feira, 16 de julho de 2013 20:38