O Framework(ASP.NET) 2.0 veio para facilitar a vida dos programadores, uma melhoria Ă© na hora que precisamos criar usuários e autenticar(Membership), outra Ă© o controle de acesso a determinadas páginas da nossa aplicação, criação de regras de quem pode e quem nĂŁo pode acessar(Roles), mas e quando precisamos customizar nossa aplicação, ou seja criar nossos prĂłprios mĂ©todos, criar uma tabela customizada, nĂŁo utilizando o padrĂŁo ASPNETDB.MDF,  este Ă© o objetivo deste artigo, mostrar como customizar os Providers Membership e Roles.

 

 

Há um tempo atrás tive que fazer uma Intranet para um colégio, onde o diretor gostaria de ter acesso às senhas dos usuários, informou que frequentemente os professores esqueciam e gostaria que os dados fossem de fácil acesso para ele manipular.

 

Minha primeira idéia foi desenvolver tudo do zero, pensei já tenho tudo pronto no ASP.NET 2.0, componentes de Login, componentes para criar usuários e etc. Por que não uso o que já tenho e customizo com o que o colégio precisa?

 

Meu primeiro passo foi criar a tabela de usuários (Figura 1).

 

Figura 1 – Tabela de usuário

 

 

Um outro requisito era criar uma área administrativa onde somente professores coordenadores (Admin) tinham acesso, e uma segunda área onde somente professores logados (OnLine) poderiam ver as noticias.

 

Para resolver esta questĂŁo eu criei duas pastas (Figura 2).

 

 

Figura 2 – Pastas restritas.

 

  

Somente os coordenadores poderiam acessar a pasta Admin e os usuários logados a pasta OnLine. Como eu fiz isso?

 

 

Creia outra tabela, onde eu defino os cargos (Roles) de cada professor (Figura 3).

 


Figura 3 – Tabela Role

 

  

E uma terceira tabela onde eu informo o usuário com o seu respectivo cargo (Rolename) (Figura 3).

 

 

 

Veja na (Figura 4) a estrutura completa do banco.

 

 

Figura 4 – Estrutura do banco MyDatabase



Eu poderia, sem problema nenhum utilizar o banco ASPNETDB.MDF que o ASP.NET 2.0 cria como padrão, mas além de querer customizar minha aplicação eu também gostaria de aprender como fugir do padrão.

 

O próximo passo era sobrescrever as classes de Membership e Roles, na classe MembershipProvider eu tenho todos os métodos para criar usuários, alterar senhas, excluir usuários etc. E como eu criei o meu próprio banco eu precisava também criar meus próprios métodos e instruções SQL, para isso eu crie uma classe chamada MyCustomMembershipProvider.cs, esta classe herda da classe MembershipProvider.

 

A classe MembershipProvider é uma classe abstrata e por este motivo eu tenho que sobrescrever todos os seus métodos, com o VS 2005 isso é fácil, basta você fazer a herança, clicar com o botão direito em cima da classe que esta herdando e clicar em Implement Abstract Class (Figura 5)

 

Figura 5 – Implement Abstract Class

 

 

O próximo passo é sobrescrever os métodos que eu preciso, como por exemplo Create User (Listagem 1)

 

public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status)

    {

        bool result = false;

 

        MembershipUser user = new MembershipUser(Name, username, providerUserKey,

            email, passwordQuestion, null, isApproved, false, DateTime.Now, DateTime.Now,

            DateTime.Now, DateTime.Now, DateTime.Now);

 

        User newUser = new User(username, password, email);

        result = newUser.Save();

 

        if (result)

        {

            status = MembershipCreateStatus.Success;

            return user;

        }

        else

        {

            status = MembershipCreateStatus.ProviderError;

            return null;

        }       

    }

 

Listam 1 – Método CreateUser

 

 

Além do método onde eu crio os usuários, também sobrescrevi o método de validação de usuário na classe Membership.

public override bool ValidateUser(string username, string password)

 

 

Criei a página utilizando o componente CreateUserWizard (Figura 6)

 

 

Figura 6 – CreateUserWizard

 

 

 

Ao clicar em Criar Usuário, irei chamar o método CreateUser.
public override MembershipUser CreateUser

 

 

Em seguida eu criei a classe MyCustomRoleProvider onde herdei da classe RoleProvider, a classe RoleProvider também é uma classe abstrata, neste caso eu fiz o mesmo processo anterior (Figura 5).

public class MyCustomRoleProvider : RoleProvider

 

Nesta classe eu sobrescrevi os seguintes métodos.

 

public override void CreateRole(string rolename)

Criação dos cargos

 

public override string[] GetRolesForUser(string username)

Obter os cargos criados

 

 

public override bool RoleExists(string roleName)

Verificar se um cargo já existe.

 

 

Neste momento eu consigo criar os cargos e salvar na tabela Rolename, em seguida eu posso cadastrar os cargos para cada usuário (Figura 3).

 

 

Para restringir a pasta Admin eu criei um arquivo Web.Config (Listagem 2), este arquivo permite acesso aos professores Admin e nega acessos aos demais usuários

 

<configuration>

  <system.web>

    <authorization>

      <allow roles="Admin"/>

      <deny users="*"/>

    </authorization>

  </system.web>

</configuration>

Listam 2 – Web.Config na pasta Admin

 

 

Para restringir a pasta OnLine eu criei outro arquivo Web.Config (Listagem 3), onde somente usuários logados possuem acesso.

 

<?xml version="1.0"?>

<configuration>

  <system.web>

    <authorization>

      <deny users="?"/>

    </authorization>

  </system.web>

</configuration>

Listam 3 – Web.Config na pasta OnLine

 

 

Um configuração que nĂŁo posso deixar de fazer Ă© configurar o arquivo Web.Config que fica na raiz da aplicação, caso contrário ele irá ler o  Provider padrĂŁo do Framework (Figura 7).

 

 

Figura 7 – Arquivo Machine.config

 

 

Na (Listagem 4) a configuração do arquivo Web.Config. Repare que no defaultProvider eu informo o nome das classes criadas.

  

<membership defaultProvider="MyCustomMembershipProvider">

       <providers>

          <add connectionStringName="ConnectionString" passwordFormat="Hashed"

             minRequiredPasswordLength="2" minRequiredNonalphanumericCharacters="0"

             requiresQuestionAndAnswer="False" requiresUniqueEmail="True"

             name="MyCustomMembershipProvider" type="MyCustomMembershipProvider" />

       </providers>

    </membership>

 

 

    <roleManager defaultProvider="MyCustomRoleProvider"

     enabled="true"

     cacheRolesInCookie="true"

     cookieName=".ASPROLES"

     cookieTimeout="30"

     cookiePath="/"

     cookieRequireSSL="false"

     cookieSlidingExpiration="true"

     cookieProtection="All" >

      <providers>

        <clear />

        <add

          name="MyCustomRoleProvider"

          type="Samples.AspNet.Roles.MyCustomRoleProvider"

          connectionStringName="ConnectionString"

          applicationName="SampleApplication"

          />

      </providers>

    </roleManager>

Listam 4 – Web.Config

 

Neste momento, com o arquivo Web.Config configurado e as classe criadas eu posso criar os usuários e fazer login na aplicação (Figura 8).

 

Figura 8 – Login

 

  

Se eu logar com o usuário galante que é admin terei acesso ao arquivo Default.aspx que fica na pasta OnLine. (Figura 9).

 

 

Figura 9 – Usuário galante (admin)

 

Usuário autenticado (Figura 10).

 

 

Figura 10 – Usuário rita (autenticado)

 

 

 

Neste artigo demonstrei como você pode customizar sua aplicação utilizando as classes Membership e Roles de acordo com a necessidade do cliente.