ASP .NET - Restringindo o acesso a todas as páginas da sua aplicação web


Você sabe como restringir o acesso a todas as páginas de sua aplicação ASP .NET permitindo o acesso somente a usuários autorizados ?

Se não sabe, hoje você vai aprender...

Para fazer isso basta alterar as configurações do arquivo Web.config da sua aplicação para especificar a autenticação de formulários, e crie uma página de login para coletar credenciais de usuário e completar a verificação de autenticação.

Para mostrar como fazer isso vamos criar uma aplicação Web Forms usando o Visual Web Developer 2010 Express Edition.(VWD 2010)

Abra o VWD 2010 e clique no menu File->New Project selecionando o template ASP .NET Empty Web Application informando o nome RestricaoAcesso;

Eu vou usar a linguagem Visual Basic mas você pode escolher a linguagem C#.

Será criado uma solução contendo apenas o arquivo Web.Config;

Abra o arquivo Web.Config e faça o seguinte:

1- Defina o atributo mode do elemento <authentication> como Forms;

<authentication mode="Forms">

2- Adicione um elemento filho <forms> ao elemento <authentication> para especificar os aspectos chaves da implementação de formulários. Abaixo temos a configuração que vamos usar no exemplo do artigo:

........
  <authentication mode="Forms">
        <
forms name=".RestricaoAcesso"
          loginUrl="Login.aspx"
          protection="All"
          timeout="30"
          path="/">
        </forms>

 </authentication>
........

3- Adicione os elementos filhos <deny> e <allow> ao elemento <authorization> para negar o acesso aos usuários anônimos e permitir o acesso a todos os usuários autenticados;

   <authorization>
        <deny users="?" />
        <!-- Nega o acesso para usuário anônimo -->
        <allow users="*" />
        <!-- Permite o acesso a todos os usuários autenticados -->
  </authorization>

4- Inclua um novo Web Form com o nome Login.aspx via menu Project -> Add New Item -> Web Form;

5- Inclua um novo Web Form com o nome Default.aspx via menu Project -> Add New Item -> Web Form, e define este formulário como o formulário de início da aplicação clicando sobre o nome do mesmo com o botão direito do mouse e selecionando a opção : Set As Start Page;

6- Inclua um novo Web Form com o nome AcessoRestrito.aspx via menu Project -> Add New Item -> Web Form;

Neste momento teremos uma solução contendo um projeto com 3 Web Forms e um arquivo Web.Config;

7- Inclua no formulário Login.aspx um controle Login a partir da ToolBox, guia Login, e personalize o componente conforme as suas necessidades.

No Exemplo usado neste artigo a página Login.aspx terá a seguinte aparência e código:

<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="Login.aspx.vb" Inherits="RestricaoAcesso.Login" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<form runat="server">
<asp:login runat="server" BorderPadding="4" BorderStyle="Solid"  BorderWidth="1px" FailureText="Lógin inválido, tente novamente" 
    Font-Names="Verdana" Font-Size="Medium" Height="185px"  PasswordLabelText="Senha :" 
    PasswordRequiredErrorMessage="A senha é obrigatória."  RememberMeText="Lembrar-me da próxima vez" UserNameLabelText="Usuário :" 
    UserNameRequiredErrorMessage="O usuário é obrigatório." Width="339px"
    onauthenticate="Login_Authenticate">
    <InstructionTextStyle Font-Italic="True" ForeColor="Black" />
    <LoginButtonStyle BackColor="#FFFBFF" BorderColor="#CCCCCC" BorderStyle="Solid" 
        BorderWidth="1px" Font-Names="Verdana" Font-Size="0.8em" ForeColor="#284775" />
    <TextBoxStyle Font-Size="0.8em" />
    <TitleTextStyle BackColor="#5D7B9D" Font-Bold="True" Font-Size="0.9em" ForeColor="White" />
</asp:login>
</form>
<br />
<input type="button" value="Tentativa de acesso sem Login"  onclick="document.location='Default.aspx'" style="width: 347px" />
</html>

No arquivo code-behind Default.aspx.vb faça o seguinte:

8- Use o manipulador de evento Authenticate do controle Login para verificar as credenciais do usuário;

9- Se as credenciais do usuário são válidas, crie um cookie de autenticação Forms e adicione-o à coleção de cookies retornado para o navegador, chamando o método SetAuthCookie da classe FormsAuthentication;

10- (Opcional) Defina o cookie de autenticação Forms para ser mantido na máquina do cliente;

11- Redirecione o usuário para a página inicial apropriada da aplicação usando Response.Redirect;

Protected Sub Login_Authenticate(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.AuthenticateEventArgs)

    'nome do parâmetro querystring contendo a URL de retorno
    Const URL_RETORNO As String = "ReturnURL"
    Dim dbConn As OleDbConnection = Nothing
    Dim dCmd As OleDbCommand = Nothing
    Dim dr As OleDbDataReader = Nothing
    Dim strConnection As String
    Dim strSQL As String
        Dim proximaPagina As String

    Try
            'obtem a string de conexão do arquivo web.config e abre a conexão com o banco de dados
            strConnection = ConfigurationManager.ConnectionStrings("dbConnectionString").ConnectionString
            dbConn = New OleDb.OleDbConnection(strConnection)
            dbConn.Open()

            'verifica se o usuário exite no banco de dados
            strSQL = "SELECT Nome AS NomeUsuario " & _
                          "FROM Usuarios " & _
                          "WHERE LoginID=? AND " & "Password=?"

            dCmd = New OleDbCommand(strSQL, dbConn)
            dCmd.Parameters.Add(New OleDbParameter("LoginID", ControleLogin.UserName))
            dCmd.Parameters.Add(New OleDbParameter("Password", ControleLogin.Password))
            dr = dCmd.ExecuteReader()

            If (dr.Read()) Then
                'O usuário foi autenticado
                FormsAuthentication.SetAuthCookie(CStr(dr.Item("Nome")), ControleLogin.RememberMeSet)

                'obtem a proxima pagina para o usuário
                If (Not IsNothing(Request.QueryString(URL_RETORNO))) Then
                    'usuario tentou acessar a pagina sem login 
                    'logo será redirecionado para pagina original requisitada
                    proximaPagina = Request.QueryString(URL_RETORNO)
                Else
                    'usuário veio direto para página de Login então direciona para a página Default
                    proximaPagina = "Default.aspx"
                End If

                'Redireciona o usuário para a proxima pagina
                Response.Redirect(proximaPagina, True)
            Else
                'o usuário não existe no banco de dados envia uma mensagem indicando o problema
                ControleLogin.FailureText = "Login ID ou password Incorretos. " & "verifique e tente novamente."
            End If
    Finally
        'libera recursos usados
        If (Not IsNothing(dr)) Then
            dr.Close()
        End If
        If (Not IsNothing(dbConn)) Then
            dbConn.Close()
        End If
    End Try

End Sub

O código esta comentado e creio que não necessito entrar em mais detalhes.

Pegue o projeto completo aqui: RestricaoAcesso.zip

Rom 8:1 Portanto, agora nenhuma condenação há para os que estão em Cristo Jesus.
Rom 8:2
Porque a lei do Espírito da vida, em Cristo Jesus, te livrou da lei do pecado e da morte.

Referências:


José Carlos Macoratti