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.
Este artigo foi publicado anteriormente em BR301240
Definir as configurações de segurança no arquivo Web.config
Esta seção demonstra como adicionar e modificar as seções de configuração <autenticação> e <autorização> para configurar o aplicativo ASP.NET de modo a usar autenticação com base em formulários.
No Solution Explorer, abra o arquivo Web.config.
Altere o modo de autenticação para Forms (Formulários).
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.) Copie o seguinte código e clique em Paste as HTML (Colar como HTML) no menu Edit (Editar) para colar o código na seção <autenticação> do arquivo:
Criar uma tabela de banco de dados de exemplo para armazenar detalhes do usuário
Esta seção demonstra como criar um banco de dados de exemplo para armazenar o nome de usuário, senha e função para os 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.
No menu Iniciar, clique em Executar e digite notepad para abrir o Bloco de notas.
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
Salve o arquivo como Users.sql.
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.
Este formulário da Web é usado para apresentar um formulário de logon aos usuários de modo que eles possam fornecer seus nomes de usuário e senhas para fazer logon no aplicativo.
Altere para o modo de exibição Design e salve a página.
Crie uma função ValidateUser para validar as credenciais de usuário procurando no banco de dados. (Verifique se alterou a seqüência Connection (Conexão) para apontar para o 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 ) ); }
É 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 o cookie de autenticação de formulários e redirecionar o usuário para uma página apropriada no evento cmdLogin_ServerClick:
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
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 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); }
Verifique se o seguinte código foi adicionado ao método InitializeComponent no código gerado pelo Web Form Designer:
this.cmdLogin.ServerClick += new System.EventHandler(this.cmdLogin_ServerClick);
Essa seção cria uma página de teste para a qual os usuários são redirecionados após a autenticação. Se os usuários forem para essa página sem antes fazer o logon no aplicativo, serão redirecionados à página de logon.
Renomeie a página WebForm1.aspx existente como Default.aspx e abra essa página no editor.
Altere para o modo de exibição HTML e copie o seguinte código entre as marcas <form>:
Clique duas vezes em SignOut (Sair) para abrir a página com código oculto (Default.aspx.cs) e copie o seguinte código no manipulador de eventos cmdSignOut_ServerClick:
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.
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:
Para obter informações adicionais sobre como implementar autenticação com base em formulários que usa um arquivo XML para armazenar usuários e senhas, consulte o seguinte tópico na documentação de .NET Framework Software Development Kit (SDK):
Para obter informações adicionais sobre a segurança de aplicativo da Web ASP.NET, consulte a seguinte documentação do Microsoft .NET Framework Developer's Guide:
Para obter informações adicionais sobre o espaço para nome System.Web.Security, consulte a seguinte documentação do Microsoft .NET Framework Reference:
Quanto esforço foi necessário para seguir os procedimentos deste artigo?
Muito baixo
Baixo
Moderado
Alto
Muito alto
O que podemos fazer para melhorar essa informação?
Para proteger sua privacidade, não inclua informações de contato em seus comentários.
Obrigado! Seus comentários são usados para nos ajudar a aperfeiçoar o conteúdo de suporte. Para obter mais opções de ajuda, visite a Home Page de Ajuda e Suporte.