none
Verificar privilégios ao executar WebMethod de WebService RRS feed

  • Pergunta

  • Pessoal, bom dia!

     

    Estou desenvolvendo uma aplicação web onde é executada várias requisições AJAX para WebMethods de WebServices.

     

    Dentro da minha aplicação, utilizo uma classe User onde armazeno algumas informações do usuário logado na ferramenta, como nome, e-mail, privilégios, etc.

     

    Como eu posso fazer para validar se o usuário pode executar um determinado WebMethod da minha aplicação? Não quero colocar em cada WebMethod essa validação... gostaria de utilizar algo mais ou menos assim:

    [NeedAccessLevel(AccessLevel.Administrator)]
    public void createUser(........) 
    {
         // Executa logica para criar um usuário
    }
    

     

    Assim, eu consigo apenas definir o privilégio que o usuário precisa para executar esse WebMethod. Caso ele não possua, jogar uma exceção do tipo AccessDeniedException (por exemplo).

     

    Há algo pronto que já faça isso? Se não, como eu posso interceptar uma chamada de WebMethod (estilo o PageLoad() de páginas .aspx) ?

     

    *Obs.: em relação ao tipo de autenticação que eu estou fazendo hoje, não há nada concreto ainda. Estou deixando o meu usuário em Sessão mas, se for o caso, consigo trocar esse item tranquilamente (ainda estamos no inicio do projeto).

     

    Poderiam me ajudar?

     

    Obrigado!

    quarta-feira, 4 de janeiro de 2012 19:44

Respostas

Todas as Respostas

  • quinta-feira, 5 de janeiro de 2012 12:30
  • Então,

     

    Em relação a autenticação eu consegui entender bem. Mas ainda há uma questão nao respondida:

     

    Como eu posso colocar um atributo no meu WebMethod para identificar se o usuário logado na minha ferramenta possui privilégios para executar esse WebMethod?

     

    Pois para mim será complicado eu codificar um método e colocar a chamada dele em cada WebMethod para validar as permissões de um usuário na minha ferramenta (ex.: administrador, vendedor, caixa, etc.). O ideal nesse caso é tratar esse tipo de validação antes de chegar no WebMethod.

     

    Pensei em utilizar alguma coisa parecida com AOP mas não sei se é vantagem. É muito pesado esse recurso (pelo menos foi o que me passaram até agora). Sem contar que deve haver alguma forma de eu intervir na chamada de um WebMethod, sabendo qual que é a classe de WebService que vai ser utilizada, qual é o metodo que está sendo invocado, etc.

     

    Há alguma sugestão referente a este ponto? Necessito muito de algo parecido, pois a manutenção na ferramenta vai cair MUITO futuramente.

    quinta-feira, 5 de janeiro de 2012 22:20
  • Na verdade vc tb pode fazer pelos roles da sua app, aqui tb tem uma dica

    http://www.code-magazine.com/article.aspx?quickid=0307071&page=3


    Não esqueça de usar o componente </> na barra para posta seu código. Microsoft MCPD,MCTS,MCC
    sexta-feira, 6 de janeiro de 2012 11:33
  • Seilor,

     

    No caso, o exemplo está fazendo exatamente o que eu não quero.

     

    O que eu queria era algo do tipo:

     

    //.... All WebService stuff
    [WebMethod]
    [("Admin")]
    public void DoAction()
    {
        // WebService Business Logic
    }

     


    e ter algo que faça isso:

    public void BeforeRunAnyWebMethod(Type webServiceType, String webMethod)
    {
         object[] attributes = webServiceType.GetMethod(webMethod).GetCustomAttributes(typeof(RequiredPermission), true);
    
         if(attributes.Length > 0) {
              if (!((RequiredPermission)attributes[0]).GetPermission.Equals(userObjectOfSession.Permission)) throw new YouDontHavePermissionException();
         }
    }

     

    Mas, como eu disse, para eu ter algo parecido com esse cara que verifica a permissão, preciso colocar ele em algum lugar que eu consigo identificar qual WebService está sendo chamado, qual WebMethod, etc. para depois, pegar o tipo da classe do meu WebMethod e, assim, fazer uma verificação parecida com o que tem ai (logico que provalvelmente isso ai em cima nem compila. Apenas um exemplo)

     

    Hoje eu faço isso com as minhas páginas, mas para isso eu criei uma página "PageBase"  que herda System.Web.UI.Page e, dentro do OnInit eu verifico a permissão do usuário (mais ou menos igual o que eu postei ai em cima). Eu quero fazer isso para os meus WebServices tb.

     

    Você sabe onde eu posso implementar o código que eu demonstrei acima? Em um Handler, em uma classe maluca de uma library mais doida ainda? Preciso de ajuda nesse ponto.

     

    Em relação ao FormsAuthentication, já coloquei tudo certo. Só preciso colocar essas validações.

     

    Desde já, obrigado por estar me ajudando!

    sexta-feira, 6 de janeiro de 2012 18:36
  • Veja essa modelo 

    http://msdn.microsoft.com/en-us/magazine/cc948343.aspx

     

    vou migrar para o forum de wcf tb o israel lá vai poder lhe ajudar melhor


    Não esqueça de usar o componente </> na barra para posta seu código. Microsoft MCPD,MCTS,MCC
    • Marcado como Resposta Rafael Balconi segunda-feira, 9 de janeiro de 2012 15:32
    segunda-feira, 9 de janeiro de 2012 10:52