Olá, Com o crescente aumento da tecnologia, cada vez mais as empresas estão informatizando todos seus processos e suas áreas, por isso nesse cenário é comum você encontrar em uma empresa com mais de um sistema operando, e caso esta empresa não tenha uma arquitetura da infra-estrutura correta, a mesma irá ter dificuldades em controlar todos estes sistemas. Um grande desafio dos administradores de sistemas é unificar operações comuns, e uma das operações é a que iremos abordar neste artigo, trata-se de um sistema de login integrado com o ADAM LDAP, dessa forma você poderá usar o mesmo usuário do Windows para se autenticar no sistema.

Requisitos para o Exemplo -

Neste nosso exemplo iremos usar o Visual Studio 2008 com Framework 3.5, caso não tenha instalado, efetue o download gratuitamente no seguinte site : http://www.microsoft.com/Express/

Será necessário baixar o ADAM este poderá ser baixado em http://www.microsoft.com/downloads/details.aspx?FamilyId=9688F8B9-1034-4EF6-A3E5-2A2A57B5C8E4&displaylang=en, e por ultimo iremos utilizar em nosso cenário autenticação do tipo LDAP e por isso iremos usar uma API chamda Client.NET LDAP ele é bem intuitiva o que torna este exemplo simples de compreender, para baixar acesse o seguinte endereço: http://www.ldapservices.com/Products/LdapClient.Net/default.aspx.

Antes de ir direto para o código é necessário que tenhamos um conhecimento do processo de autenticação do Windows. O Microsoft ADAM (Active Directory Application Mode) é um servidor LDAP para aplicação de desenvolvedores ele é gratuito e fácil de instalar e pode “crescer” em full-Blown, e também é simples de usar uma vez que ele é executado em um ambiente Windows com a autenticação NTLM e/ou com LDAP.

Instalando o ADAM

1-) Criando uma instância no ADAM: Após efetuar o download e instalar os pré-requisitos acima, inicie o ADAM Setup Wizard, clicando em Iniciar -> Programas -> ADAM -> Create an ADAM Instance.

Criando Instância do ADAM

Figura 1 – Criando Instância do ADAM

2-) Coloque o nome da Instância como LDAP1, o número da porta LDAP deixe como 389 e a porta para o SSL deixe como 636, conforme imagem abaixo:

Portas da Configuração do ADAM

Figura 2 – Portas da Configuração do ADAM

3-) Crie uma partição para sua aplicação conforme Figura 3 abaixo:

Partition ADAM

Figura 3 – Partition ADAM

4-) Após configurar o ADAM, clique em Avançar e aguarde que o ADAM crie a instância LDAP. Quando este processo estiver concluído, você terá um diretório vazio com o MS-User Schema instalado. Você poderá se conectar a ele apenas com o ADSI.

Criando uma conta de usuário no ADSIEdit

1-) Nós usaremos o ADSIEdit para criar dois novo usuários. O primeiro Usuário será administrador e o segundo usuário terá uma conta de serviço para a aplicação ASP.NET.

2-) Vá em Iniciar -> Programa -> ADAM -> ADAM ADSI Edit, clique com o botão direito em ADAM ADSI Edit e selecione Connecto to -> Seleciona Configuration na tela que irá se abrir deixe conforme a imagem abaixo, importante estar no modo Distinguished name (DN) or naming context e no textbox estar desta forma:

cn=Sandbox, dc=ITOrg
Connection

Figura 4 – Connection ADAM

3-) Agora, precisamos criar um Container para armazenar o nossos usuários. Vá para o CN= Sandbox, DC=ITOrg container, botão direito e selecione New Object, selecione Container e clique em Next. Na tela que irá abrir preencha o value como PEOPLE, e clique em next posteriormente Finish para criar o container.

4-) Vá até o container CN=PEOPLE criado anteriormente, botão direito e escolha a opção New Object , selecione usuário e clique em Next. Na tela que irá abrir preencha o value como SUPERUSER, e clique em next posteriormente Finish para criar o usuário.

Nota: Por padrão no Windows Server ADAM quando se cria um usuário sempre irá criar a conta desabilitada, para usar modifique o atributo do usuário sua msDS-UserAccountDisabled atributo para false.

5-) No usuário defina a senha para p@ss0word, pronto nossa estrutura já esta pronta para testarmos os usuários com autenticação LDAP.

Finalmente Código

Bom, finalmente chegamos na parte mais interessante, codificar nosso sistema, após todos os passos seguidos anteriormente, agora iremos criar uma aplicação web que irá testar a autenticação.

1-) Abra o VS 2008, clique em File -> New -> Project -> Na tela que irá se abrir escolha ASP.NET Web Application, no campo NAME digite LdapAuth o nome da SOLUTION pode deixar com LdapAuth, conforme imagem abaixo.

Criando o Projeto

Figura 6 – Criando o Projeto

2-) Na pagina Default, insira 2 textBox, 3 Label e um Button, deixando imagem a seguir:

Controles da Página

Figura 7 – Controles da Página

Nota: No Label Superior deixe a propriedade Visible com False, pois esta mensagem apenas irá aparecer caso o login falhe.

3-) Abra o arquivo Default.cs e iremos para a codificação dos métodos para validar o usuário e senha digitados na página acima.

Faça a referência a DLL do LDAP.Client instalado anteriormente.

using LdapServices.Ldap;

- Crie um método para validar a autenticação veja abaixo:


private bool Authenticate(string username, string password)     
{         
    bool authenticated = false;           
    using (LdapServices.Ldap.Client client = new LdapServices.Ldap.Client()) 
   {            
     try        
      {          
         // Verifica o usuário e senha se estiver correto 
        // Atribui a variavel true a variavel authenticate            
      // ou seja usuário é válido              
      LdapConnectionConfigurationSection config = LdapConnectionConfigurationSection.Current;          
      client.Connect(config.Server, config.Port,username, password);        
      //Buscar o perfil do usuário      
     //Após buscar o perfil que o usuário possui            
     // Vc poderá montar os acessos que o usuário terá no site;                     
    GetRolesForUser(username); //Método abaixo para pegar roles do usuário;                 
     LdapRoleCache.Current.Remove(username);                
     authenticated = true;          
  } catch (LdapException)        
     {           
       //Retorna um usuário inválido
       errorLabel= "Usuario ou Senha incorretos";        
       authenticated = false;        
     }    
  } 
  return authenticated;  
} }

4-) Partindo do pressuposto que as credenciais do usuário são validas, é necessário verificar qual perfil ele esta associado, desta maneira podemos definir as permissões que ele terá no sistema. O GetRolesForUser realiza esta tarefa.


 private string[] GetRolesForUser(string username)     
   {        
      string[] roles = LdapRoleCache.Current[username];     
      if (roles == null)  
     {      
       using (LdapServices.Ldap.Client client = new LdapServices.Ldap.Client())      
       {        
         // Abra a conexão com o LdapConnectionConfigurationSection;    
        LdapConnectionConfigurationSection config = 
        LdapConnectionConfigurationSection.Current;
        client.Connect(config.Server, config.Port, config.User, config.Password);                 
        LdapServices.Ldap.EntryCollection userEntries = client.Search(config.BaseDn, "distinguishedName=" + username);       
       if (userEntries.Count == 1)         
        {          
           //Pega as roles associados com o usuaário;         
            LdapServices.Ldap.Attribute memberOf = userEntries[0].Attributes["memberof"];                       
            // Copia os valores para um array de string;         
            roles = new string[memberOf.Values.Count];         
            for (int i = 0; i < memberOf.Values.Count; i++)           
            {             
              string adamGroupName = memberOf.Values[i].StringValue;     
             //Retirando as virgulas do array e trocando por pontos.            
             roles[i] = adamGroupName.Replace(',', '.');        
           }    
           // Salvando informações do role do usuário no cache Ldap.                     
           LdapRoleCache.Current[username] = roles;      
       }       
   }      
 } 
 // Se usuário não possuir nenhuma role associada a ele manter array roles como vazio.            
   if (roles == null)   
      {       
        roles = new string[] { };  
       }     
      return roles; 
 }

5-) Por fim, agora iremos associar a chamada dos métodos a o evento do botão logar da página, para isso basta apenas dar um duplo clique no botão e inserir o código abaixo:

protected void LoginButton_Click(object sender, EventArgs e)
     {     
    string username = UsernameTextBox.Text;    
    string password = PasswordTextBox.Text;    
   if (this.Authenticate(username, password))    
     {       
        FormsAuthentication.RedirectFromLoginPage(username, false);   
      }    
       else    
       {      
          this.errorLabel.Visible = true;   
        } 
    }

Antes de iniciarmos os testes das paginas, iremos fazer algumas alterações no web.config, iremos alterar o modo de autenticação para Forms Authentication, para mais informações acesse: http://msdn.microsoft.com/en-us/library/xdt4thhy.aspx

E chegamos ao final do artigo, agora você já pode testar sua página usando a autenticação LDAP com o ADAM, nos próximos artigos irei mostrar como criar paginas para o controle de usuários como Criação, Edição, Habilitar e Desabilitar uma conta e vincular Roles, então, até lá.

Referências : http://www.microsoft.com/windowsserver2003/adam/default.mspx
http://imasters.uol.com.br/artigo/6092/servidores_windows/visao_geral_active_directory_aplication_mode