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

Artigo: 308157 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

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 SQL Server
  • Microsoft Internet Information Services (IIS) versão 5.0 ou posterior

Criar uma aplicação do ASP.NET utilizando o Visual Basic .NET

  1. Abra o Visual Studio. NET.
  2. Crie uma nova aplicação Web em 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 do Windows, 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.vb).
  1. Abra o ficheiro Logon.aspx.vb.
  2. Importar espaços de nomes necessários no código - atrás de ficheiro:
    Imports System.Data.SqlClient
    Imports 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 Function ValidateUser(ByVal userName As String, ByVal passWord As String) As Boolean
            Dim conn As SqlConnection
            Dim cmd As SqlCommand
            Dim lookupPassword As String
    
            lookupPassword = Nothing
    
            ' Check for an invalid userName.
            ' userName  must not be set to nothing and must be between one and 15 characters.
            If ((userName Is Nothing)) Then
                System.Diagnostics.Trace.WriteLine("[ValidateUser] Input validation of userName failed.")
                Return False
            End If
            If ((userName.Length = 0) Or (userName.Length > 15)) Then
                System.Diagnostics.Trace.WriteLine("[ValidateUser] Input validation of userName failed.")
                Return False
            End If
    
            ' Check for invalid passWord.
            ' passWord must not be set to nothing and must be between one and 25 characters.
            If (passWord Is Nothing) Then
                System.Diagnostics.Trace.WriteLine("[ValidateUser] Input validation of passWord failed.")
                Return False
            End If
            If ((passWord.Length = 0) Or (passWord.Length > 25)) Then
                System.Diagnostics.Trace.WriteLine("[ValidateUser] Input validation of passWord failed.")
                Return False
            End If
    
            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 the users table given a 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 = cmd.ExecuteScalar()
    
                ' Cleanup command and connection objects.
                cmd.Dispose()
                conn.Dispose()
            Catch ex As Exception
                ' 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)
            End Try
    
            ' If no password found, return false.
            If (lookupPassword Is Nothing) Then
                ' You could write failed login attempts here to the event log for additional security.
                Return False
            End If
    
            ' Compare lookupPassword and input passWord by using a case-sensitive comparison.
            Return (String.Compare(lookupPassword, passWord, False) = 0)
    
    End Function
    					
  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 Sub cmdLogin_ServerClick(ByVal sender As Object, ByVal e As System.EventArgs) _
         Handles cmdLogin.ServerClick
         If ValidateUser(txtUserName.Value,txtUserPass.value) Then
            FormsAuthentication.RedirectFromLoginPage(txtUserName.Value, _
            chkPersistCookie.Checked)
         Else
            Response.Redirect("logon.aspx", True)
         End If
      End Sub
      						
    • 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 Sub cmdLogin_ServerClick(ByVal sender As Object, _
         ByVal e As System.EventArgs) Handles cmdLogin.ServerClick
         If Validateuser(txtUserName.Value,txtUserPass.Value) Then
            Dim tkt As FormsAuthenticationTicket
            Dim cookiestr As String
            Dim ck As HttpCookie
      
            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) then ck.Expires=tkt.Expiration 
            ck.Path = FormsAuthentication.FormsCookiePath() 
            Response.Cookies.Add(ck)
      
            Dim strRedirect As String
            strRedirect = Request("ReturnURL")
            If strRedirect <> "" Then
               Response.Redirect(strRedirect, True)
            Else
               strRedirect = "default.aspx"
               Response.Redirect(strRedirect, True)
            End If
         Else
            Response.Redirect("logon.aspx", True)
         End If
      End Sub
      						

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:
    Imports System.Web.Security
    					
  5. Abra a página de código (Default.aspx.vb) e copie o código seguinte no processador de eventos cmdSignOut_ServerClick :
    Private Sub cmdSignOut_ServerClick(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    Handles cmdSignOut.ServerClick
       FormsAuthentication.SignOut()
       Response.Redirect("logon.aspx", True)
    End Sub
    					
  6. Guarde e compilar o projecto. Pode agora utilizar a aplicação.

Resolução de problemas

  • 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 obter o cookie de autenticação e 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 informações sobre como implementar a autenticação baseada em formulários simples utilizando o <credentials> secção para armazenar os utilizadores e palavras-passe, consulte o seguinte artigo os exemplos de iniciação rápida ao ASP.NET:
Autenticação baseada em formulários
http://quickstarts.asp.net/QuickStartv20/aspnet/doc/security/formsauth.aspx
Para obter informações sobre como implementar a autenticação baseada em formulários utilizando um ficheiro XML (Extensible Markup Language) 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
Para obter mais informações sobre segurança de aplicações Web do ASP.NET, consulte o seguinte artigo na documentação do .NET Framework SDK:
Segurança de aplicações Web do ASP.NET
http://msdn2.microsoft.com/en-us/library/330a99hc(vs.71).aspx
Para obter mais informações sobre o espaço de nomes System.Web.Security , consulte o seguinte artigo no .NET Framework SDK documentação:
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 os seguintes artigos .NET Framework SDK:
Configuração do ASP.NET
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
Para obter informações sobre 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
Para mais informações gerais sobre ASP.NET, consulte o newsgroup MSDN seguinte:
microsoft.public.dotnet.framework.aspnet
Para mais informações, consulte os seguintes livros:
Esposito, Dino. Building Web Solutions with ASP.NET and ADO.NET. A Microsoft Press, 2001.

Howard e David LeBlanc e Michael. Writing Secure Code. A Microsoft Press, 2001.

Propriedades

Artigo: 308157 - Última revisão: segunda-feira, 29 de Outubro de 2007 - Revisão: 8.11
A informação contida neste artigo aplica-se a:
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 7.0 Standard Edition
Palavras-chave: 
kbmt kbproductlink kbconfig kbhowtomaster kbsecurity kbweb KB308157 KbMtpt
Traduçã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: 308157

Submeter comentários