Artigo: 301240 - Última revisão: domingo, 13 de Maio de 2007 - Revisão: 7.11

Como implementar a autenticação baseada em formulários na sua aplicação do ASP.NET utilizando C# .NET

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.

Nesta página

Expandir tudo | Reduzir tudo

Sumário

Este artigo demonstra como implementar a autenticação baseada em formulários utilizando uma base de dados para armazenar os utilizadores.

Requisitos

A lista seguinte descreve o hardware recomendado, software, infra-estrutura de rede e service packs que necessita:
  • Microsoft Visual Studio .NET
  • Microsoft Internet Information Services (IIS) versão 5.0 ou posterior
  • Microsoft SQL Server

Criar uma aplicação do ASP.NET com o C# .NET

  1. Abra o Visual Studio. NET.
  2. Criar uma nova aplicação Web do ASP.NET e especifique o nome e localização.

Configurar as definições de segurança no ficheiro Web.config

Esta secção demonstra como adicionar e modificar o <authentication> e <authorization> secções de configuração para configurar a aplicação do ASP.NET para utilizar a autenticação baseada em formulários.
  1. No Solution Explorer, abra o ficheiro Web.config.
  2. Altere o modo de autenticação para formulários .
  3. Inserir tag <forms> e preencha os atributos apropriados. (Para obter mais informações sobre estes atributos, consulte a MSDN documentação ou a documentação de iniciação rápida ao que está listada nosecção "REFERENCES".) Copie o código seguinte e clique em Colar como HTML no menu Editar para colar o código de <authentication> secção do ficheiro:
    <authentication mode="Forms">
       <forms name=".ASPXFORMSDEMO" loginUrl="logon.aspx" 
       protection="All" path="/" timeout="30" />
    </authentication> 
    					
  4. Negar o acesso ao utilizador anónimo no <authorization> secção da seguinte forma:
    <authorization>
       <deny users ="?" />
       <allow users = "*" />
    </authorization>
    					

Criar uma tabela de base de dados de exemplo para detalhes de utilizadores de arquivo

Esta secção demonstra como criar uma base de dados exemplo para armazenar o nome de utilizador, a palavra-passe e a função para os utilizadores. A coluna de função é necessário se pretender armazenar funções de utilizador na base de dados e implementar segurança baseada em funções.
  1. No menu Iniciar , clique em Executar e, em seguida, escreva o bloco de notas para abrir o bloco de notas.
  2. Realce o seguinte código de script SQL, clique com o botão direito do rato no código e, em seguida, 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. Guarde o ficheiro como Users.sql.
  4. No computador com o Microsoft SQL Server, abra Users.sql no analisador de consultas. Na lista de bases de dados, clique em pubs e execute o script. Isto cria uma tabela de utilizadores de exemplo e preenche a tabela de base de dados Pubs a ser utilizado com esta aplicação de exemplo.

Criar uma página logon.aspx

  1. Adicione um novo formulário da Web ao projecto denominado logon.aspx.
  2. Abra a página logon.aspx no editor e, mudar para HTML visualizar.
  3. Copie o seguinte código e utilize a opção Colar como HTML no menu Editar para inserir o código entre os códigos <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" />
    						
    o formulário da Web é utilizado para apresentar um formulário de início de sessão aos utilizadores para que estes podem fornecer respectivo nome de utilizador e palavra-passe para iniciar sessão a aplicação.
  4. Mudar para a vista de estrutura e guarde a página.

O processador de eventos de código para que este valida as credenciais do utilizador

Esta secção apresenta o código que é colocado na página de código (Logon.aspx.cs).
  1. Faça duplo clique em início de sessão para abrir o ficheiro Logon.aspx.cs.
  2. Importar espaços de nomes necessários no código - atrás de ficheiro:
    using System.Data.SqlClient;
    using System.Web.Security;
    					
  3. Crie uma função ValidateUser para validar as credenciais do utilizador ao procurar na base de dados. (Certifique-se de que altere a cadeia de ligação para apontar para a base 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. Pode utilizar um dos dois métodos para gerar o cookie de autenticação de formulários e redireccionar o utilizador para uma página adequada no evento cmdLogin_ServerClick . Código de exemplo é fornecido para ambos os cenários. Utilize um acordo com que o requisito.
    • Chamar o método RedirectFromLoginPage para gerar o cookie de autenticação de formulários e redireccionar o utilizador para uma página adequada no evento cmdLogin_ServerClick automaticamente:
      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);
      }
      						
    • Gerar a permissão de autenticação, encriptação, criar um cookie, adicioná-lo a resposta e redireccionar o utilizador. Isto dá-lhe mais controlo na forma como cria o cookie. Pode também incluir dados personalizados juntamente com FormsAuthenticationTicket neste 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 é adicionado o seguinte código para o método InitializeComponent o código que gera o criador de formulários Web:
    this.cmdLogin.ServerClick += new System.EventHandler(this.cmdLogin_ServerClick);
    					

Criar uma página default.aspx

Esta secção cria uma página de teste para o qual os utilizadores são redireccionados depois de se autenticar. Se os utilizadores navegam para esta página sem iniciar primeiro sessão na aplicação, são redireccionados para a página de início de sessão.
  1. Mudar o nome existente WebForm1.aspx página como default.aspx e abra-o no editor.
  2. Mude para a vista de HTML e, copie o seguinte código entre os códigos <form>:
    <input type="submit" Value="SignOut" runat="server" id="cmdSignOut">
    						
    este botão é utilizado para terminar a sessão de autenticação de formulários.
  3. Mudar para a vista de estrutura e guarde a página.
  4. Importar espaços de nomes necessários no código - atrás de ficheiro:
    using System.Web.Security;
    					
  5. Faça duplo clique SignOut para abrir a página de código (Default.aspx.cs) e copie o código seguinte no processador 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 é adicionado o seguinte código para o método InitializeComponent o código que gera o criador de formulários Web:
    this.cmdSignOut.ServerClick += new System.EventHandler(this.cmdSignOut_ServerClick);
    					
  7. Guarde e compilar o projecto. Pode agora utilizar a aplicação.

Notas adicionais

  • Poderá pretender armazenar palavras-passe segura numa base de dados. Pode utilizar a função de utilitário de classe FormsAuthentication denominada HashPasswordForStoringInConfigFile para encriptar as palavras-passe antes de armazenar no ficheiro de base de dados ou a configuração.
  • Convém armazená-as informações de ligação SQL no ficheiro de configuração (Web.config) para que pode modificar facilmente se necessário.
  • Talvez seja melhor adicionar código para impedir que hackers que tentem utilizar diferentes combinações de palavras-passe do início de sessão. Por exemplo, pode incluir lógica que aceita apenas duas ou três tentativas de início de sessão. Se o utilizador não é possível iniciar sessão num determinado número de tentativas, poderá definir um sinalizador na base de dados para não permitir que esse utilizador iniciar sessão até que o utilizador reactiva a respectiva conta visitar uma página diferente ou chamar a linha de suporte. Além disso, deve adicionar processamento de erros apropriada sempre que necessário.
  • Uma vez que o utilizador é identificado baseia o cookie de autenticação, poderá utilizar (Secure Sockets Layer) esta aplicação para que ninguém pode iludir o cookie de autenticação e quaisquer outras informações importantes que está a ser transmitidas.
  • Autenticação baseada em formulários requer que o cliente aceitar ou activar os cookies no browser.
  • O parâmetro de tempo de espera do <authentication> secção de configuração controla o intervalo no qual o cookie de autenticação é regenerado. Pode escolher um valor que fornece o melhor desempenho e segurança.
  • Determinados proxies intermédias e caches na Internet podem colocar em cache respostas do servidor Web que contêm cabeçalhos de conjunto cookies, em seguida, são devolvidos a um utilizador diferente. Uma vez que a autenticação baseada em formulários utiliza um cookie para autenticar utilizadores, isto pode causar os utilizadores acidentalmente (ou intencionalmente) representar outro utilizador recebendo um cookie de um proxy intermédio ou cache que não foi originalmente concebido para os mesmos.

Referências

Para mais informações sobre como implementar a autenticação baseada em formulários simples que utiliza o <credentials> secção para armazenar os utilizadores e palavras-passe, consulte o exemplo de iniciação rápida de ASP.NET GotDotNet ao seguinte:
Autenticação baseada em formulários
http://quickstarts.asp.net/QuickStartv20/aspnet/doc/security/formsauth.aspx (http://quickstarts.asp.net/QuickStartv20/aspnet/doc/security/formsauth.aspx)
Para mais informações sobre como implementar a autenticação baseada em formulários que utiliza um ficheiro XML para armazenar os utilizadores e palavras-passe, consulte o tópico seguinte no .NET Framework Software Development Kit (SDK) documentação:
Autenticação de formulários utilizando um ficheiro de utilizadores XML
http://msdn2.microsoft.com/en-us/library/1b1y85bh(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/1b1y85bh(vs.71).aspx)
Para mais informações sobre segurança de aplicações Web do ASP.NET, consulte o seguinte Microsoft .NET Framework Developer guia de documentação:
Segurança de aplicações Web do ASP.NET
http://msdn2.microsoft.com/en-us/library/330a99hc(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/330a99hc(vs.71).aspx)
Para mais informações sobre o espaço de nomes System.Web.Security , consulte o seguinte Microsoft .NET Framework documentação de referência:
Espaço de nomes System.Web.Security
http://msdn2.microsoft.com/en-us/library/system.web.security(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/system.web.security(vs.71).aspx)
Para obter mais informações sobre a configuração do ASP.NET, consulte Guia de artigos o seguinte Microsoft .NET Framework para programadores do:
Configuração do ASP.NET
http://msdn2.microsoft.com/en-us/library/aa719558(VS.71).aspx (http://msdn2.microsoft.com/en-us/library/aa719558(VS.71).aspx)

Secções de configuração do ASP.NET
http://msdn2.microsoft.com/en-us/library/w7w4sb0w(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/w7w4sb0w(vs.71).aspx)
Para obter informações sobre as directrizes de segurança do ASP.NET, consulte a seguinte documentação técnica da MSDN:
Autenticação no ASP.NET: orientações de segurança do .NET
http://msdn2.microsoft.com/en-us/library/ms978378.aspx (http://msdn2.microsoft.com/en-us/library/ms978378.aspx)
Para mais informações gerais sobre ASP.NET, consulte o newsgroup MSDN seguinte:
microsoft.public.dotnet.framework.aspnet (http://msdn.microsoft.com/newsgroups/default.aspx?query=microsoft.public.dotnet.framework.aspnet&dg=&cat=en-us-msdn&lang=en&cr=US&pt=&catlist=774F24A2-F71F-425F-AC2B-DC48AB0DA5C9&dglist=&ptlist=&exp=&sloc=en-us)

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: 
kbmt kbconfig kbhowtomaster kbsecurity kbweb KB301240 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 301240  (http://support.microsoft.com/kb/301240/en-us/ )