none
Controle de acesso RRS feed

  • Pergunta

  • Pessoal, mais uma dúvida... (foi mal, é que sou nob em .Net)

    Tenho uma aplicação web onde o controle de acessos é via banco de dados, no cadastro do usuário eu especifico a quais funcionalidades ele terá acesso e monto o menu de acordo com essa informação.

    Exemplo, usuário x tem acesso de visualização e edição ao cadastro de equipamentos. Nesse caso eu apresento a opção de menu "equipamentos" e quando ele abre a aspx, dou acesso para ele pesquisar e editar.

    Para fazer isso eu criei uma classe usuário onde armazeno o perfil dele após o login, guardo essa informação na sessão e valido no onload de cada página.

    Esse é o melhor caminho? To meio preocupado de estar reinventando a roda e estar mais sujeito à falhas de implementação. Os problemas que vejo com essa implementação:

    1 - Estou reinventando a roda?

    2 - Terei que repetir o controle em cada página que eu criar;

    3 - Se eu esquecer de implementar o controle, um usuário que conheça a url da página poderá acessar de forma indevida;

    O que preciso resolver para continuar com a solução

    1 - Identificar uma forma de tornar a verificação obrigatória no Page_Load, de forma que se eu esquecer de implementar a aplicação não compile.

    2 - Identificar uma forma de implementar esse método em um único lugar, de forma que não seja necessário replicar em cada página que eu criar.

    Uma forma de fazer isso talvez seja criar uma classe abstrata que no Page_Load execute a verificação, e as demais página herdem dela. Mas tentei fazer isso e não deu muito certo, talvez eu tenha feito da forma errada.

    quarta-feira, 1 de agosto de 2012 23:40

Respostas

  • Boa noite,

    Você mesmo ja achou parte da solução. Uma classe base para suas páginas que requerem permissão de acesso é uma boa. Como não deu certo, talvez você tenha feito algo errado..

    Tenta desta forma:
    	public abstract class BasePage : System.Web.UI.Page {
    
    		protected abstract string RequiredRole { get; }
    
    		public abstract bool UserMustHavePermisssion { get; }
    
    		protected void ValidateUser() {
    			if (!Context.User.IsInRole(RequiredRole))
    				throw new InvalidOperationException("Usuário não autenticado.");
    		}
    
    		protected void Page_Load(object sender, EventArgs e) {
    			if (UserMustHavePermisssion)
    				ValidateUser();
    		}
    	}
    E nas páginas que derivar desta classe base:

    	public partial class _Default : BasePage {
    
    		protected override string RequiredRole {
    			get { return "blablka"; }
    		}
    
    		public override bool UserMustHavePermisssion {
    			get { return true; }
    		}
    	}
    Não precisaria ter necessariamente tudo que esta neste codigo, mais é so para você ter uma ideia

    Att,


    • Editado Vitor Hugo Salgado quinta-feira, 2 de agosto de 2012 02:06
    • Marcado como Resposta Gustavo28 quinta-feira, 2 de agosto de 2012 12:21
    quinta-feira, 2 de agosto de 2012 02:04

Todas as Respostas

  • Boa noite,

    Você mesmo ja achou parte da solução. Uma classe base para suas páginas que requerem permissão de acesso é uma boa. Como não deu certo, talvez você tenha feito algo errado..

    Tenta desta forma:
    	public abstract class BasePage : System.Web.UI.Page {
    
    		protected abstract string RequiredRole { get; }
    
    		public abstract bool UserMustHavePermisssion { get; }
    
    		protected void ValidateUser() {
    			if (!Context.User.IsInRole(RequiredRole))
    				throw new InvalidOperationException("Usuário não autenticado.");
    		}
    
    		protected void Page_Load(object sender, EventArgs e) {
    			if (UserMustHavePermisssion)
    				ValidateUser();
    		}
    	}
    E nas páginas que derivar desta classe base:

    	public partial class _Default : BasePage {
    
    		protected override string RequiredRole {
    			get { return "blablka"; }
    		}
    
    		public override bool UserMustHavePermisssion {
    			get { return true; }
    		}
    	}
    Não precisaria ter necessariamente tudo que esta neste codigo, mais é so para você ter uma ideia

    Att,


    • Editado Vitor Hugo Salgado quinta-feira, 2 de agosto de 2012 02:06
    • Marcado como Resposta Gustavo28 quinta-feira, 2 de agosto de 2012 12:21
    quinta-feira, 2 de agosto de 2012 02:04
  • Gustavo, bom dia

       Estas a desenvolver em Vb.Net ou C#?

      

    quinta-feira, 2 de agosto de 2012 14:01
  • Estou trabalhando com C#
    quinta-feira, 2 de agosto de 2012 18:04
  • Olá Gustavo, boa noite, desculpe a demora na resposta, é que hoje o dia foi punk, hehe...

    Então, você esta certissimo em perguntar, e saiba que estou desenvolvendo uma aplicação web e estou com o mesmo propósito.

    Eu faço a validação em cada load de cada página sim, e para controlar se o usuário "espertinho" tentar acessar direto via url, (digitando o endereço direto no browser para tentar vazar), eu crio uma Session("logado")=true/false no form de login. Se for false, também no load de cada página, "Response.Redirect("default.aspx")"...Se for true, permite acessar a determinada tela.

    Quanto a querer "centralizar" tudo para poupar código ajuda, mas nem sempre dá.

    Espero ter ajudado

    Abraços

    sexta-feira, 3 de agosto de 2012 02:31
  • Gustavo,

    Em .net, existe muitos recursos legais para segurança de aplicações web que podem facilitar sua vida. Da uma pesquisa sobre MembershipProvider, Forms Authentication, SecurityPrincipal, IIdentiy, IPrincipal...

    Att,

    sexta-feira, 3 de agosto de 2012 03:03