Como implementar a autenticação baseada em formulários em seu aplicativo ASP.NET usando o C#.NET

Traduções deste artigo Traduções deste artigo
ID do artigo: 301240 - Exibir os produtos aos quais esse artigo se aplica.
Este artigo foi publicado anteriormente em BR301240
Expandir tudo | Recolher tudo

Neste artigo

Sumário

Este artigo demonstra como implementar a autenticação com base em formulários usando um banco de dados para armazenar os usuários.

Requisitos

Esta lista descreve o hardware, software, infraestrutura de rede e Service Packs recomendados que você necessita:
  • Microsoft Visual Studio .NET
  • Serviços de Informações da Internet (IIS) versão 5.0 ou posterior
  • Microsoft SQL Server

Criar um aplicativo ASP.NET usando o C# .NET

  1. Abra o Visual Studio .NET.
  2. Crie um novo aplicativo da Web ASP.NET e especifique o nome e o local.

Defina as configurações de segurança no arquivo Web.config

Esta seção demonstra como adicionar e modificar as seções de configuração de <autenticação> e <autorização> para configurar o aplicativo ASP.NET para usar a autenticação baseada em formulários.
  1. No Solution Explorer, abra o arquivo Web.config.
  2. Altere o modo de autenticação para Forms.
  3. Insira a marca <Forms> e preencha os atributos apropriados. (Para obter informações adicionais sobre esses atributos, consulte a documentação MSDN ou a documentação QuickStart listada na seção REFERÊNCIAS.) Copia o seguinte código e clique em Colar como HTML no menu Editar para colar o código na seção <autenticação> do arquivo:
    <authentication mode="Forms">
       <forms name=".ASPXFORMSDEMO" loginUrl="logon.aspx" 
       protection="All" path="/" timeout="30" />
    </authentication> 
    					
  4. Negue acesso de usuário anônimo na seção <autorização > da seguinte maneira:
    <authorization>
       <deny users ="?" />
       <allow users = "*" />
    </authorization>
    					

Criar uma tabela de banco de dados de exemplo para armazenar os detalhes do usuário

Esta seção demonstra como criar um banco de dados de exemplo para armazenar o nome de usuário, a senha e as funções dos usuários. A coluna função é necessária se quiser armazenar funções de usuário no banco de dados e implementar segurança com base em funções.
  1. No menu Iniciar, clique em Executar e digite notepad para abrir o Bloco de notas.
  2. Destaque o seguinte código de script SQL, clique com o botão direito do mouse no código e clique em Copiar. No Bloco de notas, clique em Colar no menu Editar para colar o seguinte código:
    if exists (select * from sysobjects where id = 
    object_id(N'[dbo].[Users]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[Users]
    GO
    CREATE TABLE [dbo].[Users] (
       [uname] [varchar] (15) NOT NULL ,
       [Pwd] [varchar] (25) NOT NULL ,
       [userRole] [varchar] (25) NOT NULL ,
    ) ON [PRIMARY]
    GO
    ALTER TABLE [dbo].[Users] WITH NOCHECK ADD 
       CONSTRAINT [PK_Users] PRIMARY KEY  NONCLUSTERED 
       (
          [uname]
       )  ON [PRIMARY] 
    GO
    
    INSERT INTO Users values('user1','user1','Manager')
    INSERT INTO Users values('user2','user2','Admin')
    INSERT INTO Users values('user3','user3','User')
    GO
    					
  3. Salve o arquivo como Users.sql.
  4. No computador com Microsoft SQL Server, abra Users.sql no Query Analyzer (Analisador de consultas). A partir da lista de banco de dados, clique em pubs e execute o script. Isso cria um exemplo de tabela de usuários e preenche a tabela no banco de dados Pubs para ser usada com esse exemplo de aplicativo.

Criar uma página Logon.aspx

  1. Adicione um novo Formulário da Web ao projeto chamado Logon.aspx.
  2. Abra a página Logon.aspx no editor e altere para o modo de exibição HTML.
  3. Copie o seguinte código e use a opção Paste as HTML (Colar como HTML) no menu Edit (Editar) para inserir o código entre as marcas <form>:
    <h3>
       <font face="Verdana">Logon Page</font>
    </h3>
    <table>
       <tr>
          <td>Email:</td>
          <td><input id="txtUserName" type="text" runat="server"></td>
          <td><ASP:RequiredFieldValidator ControlToValidate="txtUserName"
               Display="Static" ErrorMessage="*" runat="server" 
               ID="vUserName" /></td>
       </tr>
       <tr>
          <td>Password:</td>
          <td><input id="txtUserPass" type="password" runat="server"></td>
          <td><ASP:RequiredFieldValidator ControlToValidate="txtUserPass"
              Display="Static" ErrorMessage="*" runat="server" 
              ID="vUserPass" />
          </td>
       </tr>
       <tr>
          <td>Persistent Cookie:</td>
          <td><ASP:CheckBox id="chkPersistCookie" runat="server" autopostback="false" /></td>
          <td></td>
       </tr>
    </table>
    <input type="submit" Value="Logon" runat="server" ID="cmdLogin"><p></p>
    <asp:Label id="lblMsg" ForeColor="red" Font-Name="Verdana" Font-Size="10" runat="server" />
    						
    Este Formulário da Web é usado para apresentar um formulário de login para os usuários, para que eles possam fornecer seu nome de usuário e senha para fazer o login no aplicativo.
  4. Altere para o modo de exibição Design e salve a página.

Código do manipulador de eventos para que ele valide as credenciais do usuário

Esta seção apresenta o código colocado na página de código oculto (Logon.aspx.cs).
  1. Clique duas vezes em Logon para abrir o arquivo Logon.aspx.cs.
  2. Importe os namespaces necessários no arquivo de código oculto:
    using System.Data.SqlClient;
    using System.Web.Security;
    					
  3. Crie uma função ValidateUser para validar as credenciais de usuário procurando no banco de dados. (Certifique-se de alterar a sequência de conexão para apontar para o seu banco de dados).
    private bool ValidateUser( string userName, string passWord )
    {
    	SqlConnection conn;
    	SqlCommand cmd;
    	string lookupPassword = null;
    
    	// Check for invalid userName.
    	// userName must not be null and must be between 1 and 15 characters.
    	if ( (  null == userName ) || ( 0 == userName.Length ) || ( userName.Length > 15 ) )
    	{
    		System.Diagnostics.Trace.WriteLine( "[ValidateUser] Input validation of userName failed." );
    		return false;
    	}
    
    	// Check for invalid passWord.
    	// passWord must not be null and must be between 1 and 25 characters.
    	if ( (  null == passWord ) || ( 0 == passWord.Length ) || ( passWord.Length > 25 ) )
    	{
    		System.Diagnostics.Trace.WriteLine( "[ValidateUser] Input validation of passWord failed." );
    		return false;
    	}
    
    	try
    	{
    		// Consult with your SQL Server administrator for an appropriate connection
    		// string to use to connect to your local SQL Server.
    		conn = new SqlConnection( "server=localhost;Integrated Security=SSPI;database=pubs" );
    		conn.Open();
    
    		// Create SqlCommand to select pwd field from users table given supplied userName.
    		cmd = new SqlCommand( "Select pwd from users where uname=@userName", conn );
    		cmd.Parameters.Add( "@userName", SqlDbType.VarChar, 25 );
    		cmd.Parameters["@userName"].Value = userName;
    
    		// Execute command and fetch pwd field into lookupPassword string.
    		lookupPassword = (string) cmd.ExecuteScalar();
    
    		// Cleanup command and connection objects.
    		cmd.Dispose();
    		conn.Dispose();
    	}
    	catch ( Exception ex )
    	{
    		// Add error handling here for debugging.
    		// This error message should not be sent back to the caller.
    		System.Diagnostics.Trace.WriteLine( "[ValidateUser] Exception " + ex.Message );
    	}
    
    	// If no password found, return false.
    	if ( null == lookupPassword ) 
    	{
    		// You could write failed login attempts here to event log for additional security.
    		return false;
    	}
    
    	// Compare lookupPassword and input passWord, using a case-sensitive comparison.
    	return ( 0 == string.Compare( lookupPassword, passWord, false ) );
    
    }
    					
  4. É possível usar um método, no total de dois, para gerar o cookie de autenticação de formulários e redirecionar o usuário para uma página apropriada no evento cmdLogin_ServerClick. Exemplo de código é fornecido para as duas situações. Use uma delas de acordo com suas necessidades.
    • Chame o método RedirectFromLoginPage para gerar automaticamente os cookies de autenticação de formulários e redirecionar o usuário para uma página apropriada no evento cmdLogin_ServerClick:
      private void cmdLogin_ServerClick(object sender, System.EventArgs e)
      {
      if (ValidateUser(txtUserName.Value,txtUserPass.Value) )
      	FormsAuthentication.RedirectFromLoginPage(txtUserName.Value,
      		chkPersistCookie.Checked);
      	else
      		Response.Redirect("logon.aspx", true);
      }
      						
    • Gere a permissão de autenticação, criptografe-a, crie um cookie, adicione-o à resposta e redirecione o usuário. Isso lhe dá mais controle com relação a como criar o cookie. Também é possível incluir dados personalizados com o FormsAuthenticationTicket nesse caso.
      private void cmdLogin_ServerClick(object sender, System.EventArgs e)
      {
         if (ValidateUser(txtUserName.Value,txtUserPass.Value) )
         {
            FormsAuthenticationTicket tkt;
            string cookiestr;
            HttpCookie ck;
            tkt = new FormsAuthenticationTicket(1, txtUserName.Value, DateTime.Now, 
      DateTime.Now.AddMinutes(30), chkPersistCookie.Checked, "your custom data");
            cookiestr = FormsAuthentication.Encrypt(tkt);
            ck = new HttpCookie(FormsAuthentication.FormsCookieName, cookiestr);
            if (chkPersistCookie.Checked)
            ck.Expires=tkt.Expiration;	
      		    ck.Path = FormsAuthentication.FormsCookiePath; 
            Response.Cookies.Add(ck);
      
            string strRedirect;
            strRedirect = Request["ReturnUrl"];
            if (strRedirect==null)
                  strRedirect = "default.aspx";
               Response.Redirect(strRedirect, true);
         }
         else
            Response.Redirect("logon.aspx", true);
      }
      						
  5. Certifique-se de que o seguinte código é adicionado ao método InitializeComponent no código gerado pelo Web Form Designer:
    this.cmdLogin.ServerClick += new System.EventHandler(this.cmdLogin_ServerClick);
    					

Criar uma página Default.aspx

Esta seção cria uma página de teste para a qual os usuários são redirecionados após eles autenticarem. Se os usuários forem para essa página sem antes fazer o logon no aplicativo, serão redirecionados à página de logon.
  1. Renomeie a página WebForm1.aspx existente como Default.aspx e abra essa página no editor.
  2. Altere para o modo de exibição HTML e copie o seguinte código entre as marcas <form>:
    <input type="submit" Value="SignOut" runat="server" id="cmdSignOut">
    						
    Este botão é usado para fazer logoff da sessão de autenticação de formulários.
  3. Altere para o modo de exibição Design e salve a página.
  4. Importe os namespaces necessários no arquivo de código oculto:
    using System.Web.Security;
    					
  5. Clique duas vezes em SignOut para abrir uma página de código oculto (Default.aspx.cs) e copie o seguinte código no manipulador de eventos cmdSignOut_ServerClick:
    private void cmdSignOut_ServerClick(object sender, System.EventArgs e)
    {
       FormsAuthentication.SignOut();
       Response.Redirect("logon.aspx", true);
    }
    					
  6. Certifique-se de que o seguinte código é adicionado ao método InitializeComponent no código gerado pelo Web Form Designer:
    this.cmdSignOut.ServerClick += new System.EventHandler(this.cmdSignOut_ServerClick);
    					
  7. Salve e compile o projeto. Agora é possível usar o aplicativo.

Observações adicionais

  • Você pode querer armazenar senhas com segurança em um banco de dados. É possível usar a função de utilitário de classe FormsAuthentication chamada HashPasswordForStoringInConfigFile para criptografar as senhas antes de armazená-las no banco de dados ou arquivo de configuração.
  • Você pode querer armazenar as informações de conexão SQL no arquivo de configuração (Web.config) de modo que possa modificá-las com facilidade, se for necessário.
  • É possível adicionar código para impedir que hackers que tentam usar combinações diferentes de senhas façam logon. Por exemplo, é possível incluir lógica que aceite apenas duas ou três tentativas de logon. Se o usuário não puder fazer logon em um determinado número de tentativas, é aconselhável definir um sinalizador no banco de dados para não permitir que ele faça logon até que reative sua conta visitando uma página diferente ou ligando para sua linha de suporte. Além disso, você deve adicionar um controle de erro adequado sempre que necessário.
  • Como o usuário é identificado com base no cookie de autenticação, é aconselhável usar SSL (Secure Sockets Layer) nesse aplicativo de modo que ninguém possa enganar o cookie de autenticação e quaisquer outras informações importantes que estão sendo transmitidas.
  • A autenticação com base em formulários exige que seu cliente aceite ou habilite cookies em seu navegador.
  • O parâmetro timeout da seção de configuração <autenticação> controla o intervalo no qual o cookie de autenticação é gerado novamente. É possível escolher um valor que fornece melhor desempenho e segurança.
  • Determinados proxies e caches intermediários na Internet podem armazenar em cache respostas do servidor da Web que contêm cabeçalhos Set-Cookie (Definir cookie), que são retornados para um usuário diferente. Como a autenticação com base em formulários usa um cookie para autenticar usuários, isso pode fazer com que usuários representem acidentalmente (ou intencionalmente) outro usuário, recebendo um cookie de um proxy ou cache intermediário que nao se destinava originalmente a eles.

Referências

Para obter informações adicionais sobre como implementar autenticação simples com base em formulários que usa a seção <credenciais> para armazenar usuários e senhas, consulte o seguinte exemplo GotDotNet ASP.NET QuickStart:
Autenticação com base em formulários (em inglês)
http://quickstarts.asp.net/QuickStartv20/aspnet/doc/security/formsauth.aspx
Para obter mais informações sobre como implementar a autenticação baseada em formulários que usa um arquivo XML para armazenar usuários e senhas, consulte o seguinte tópico na documentação do .NET Framework Software Development Kit (SDK):
Autenticação por formulários usando um arquivo de usuários XML (em inglês)
http://msdn.microsoft.com/pt-br/library/1b1y85bh(vs.71).aspx
Para obter mais informações sobre a segurança do aplicativo da Web do ASP.NET, consulte a seguinte documentação do guia do desenvolvedor do NET Framework:
Segurança de aplicativo da Web do ASP.NET (em inglês)
http://msdn.microsoft.com/pt-br/library/330a99hc(vs.71).aspx
Para obter mais informações sobre o namespace System.Web.Security, consulte a seguinte documentação de referência do Microsoft .NET Framework:
Espaço para nome System.Web.Security (em inglês)
http://msdn.microsoft.com/pt-br/library/system.web.security(vs.71).aspx
Para obter mais informações sobre a configuração ASP.NET, consulte os seguintes artigos do guia do desenvolvedor do Microsoft .NET Framework:
Configuração ASP.NET (em inglês)
http://msdn.microsoft.com/pt-br/library/aa719558(VS.71).aspx

Seções de configuração ASP.NET (em inglês)
http://msdn.microsoft.com/pt-br/library/w7w4sb0w(vs.71).aspx
Para obter mais informações sobre as diretrizes de segurança do ASP.NET, consulte o seguinte documento MSDN:
Autenticação em ASP.NET: .NET Security Guidance (em inglês)
http://msdn.microsoft.com/pt-br/library/ms978378.aspx
Para obter mais informações gerais sobre o ASP.NET, consulte o seguinte grupo de notícias MSDN:
microsoft.public.dotnet.framework.aspnet
Observação: este é um artigo de ?PUBLICAÇÃO RÁPIDA? criado diretamente pela organização de suporte da Microsoft. As informações aqui contidas são fornecidas no presente estado, em resposta a questões emergentes. Como resultado da velocidade de disponibilização, os materiais podem incluir erros tipográficos e poderão ser revisados a qualquer momento, sem aviso prévio. Consulte os Termos de Uso para ver outras informações.

Propriedades

ID do artigo: 301240 - Última revisão: sexta-feira, 29 de junho de 2012 - Revisão: 1.0
A informação contida neste artigo aplica-se a:
  • Microsoft ASP.NET 1.1
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft ASP.NET 1.0
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 7.0 Standard Edition
  • Microsoft SQL Server 2000 64-bit Edition
Palavras-chave: 
kbconfig kbhowtomaster kbsecurity kbweb KB301240

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com