ASP .NET - Acesso seguro com download de arquivos na web


O objetivo deste artigo é mostrar como criar uma aplicação ASP .NET que tenha as seguintes funcionalidades:

Um possível cenário para este estudo é aquele no qual você informa uma URL a um usuário previamente cadastrado e quando ele acessa a URL é apresentada uma página de Login que irá verificar a autenticação do usuário. Se o login for feito com sucesso é apresentada uma página com uma relação de arquivos para download e o usuário escolhe um arquivo e efetua o download do mesmo.

Para criar esta solução eu vou usar as seguintes ferramentas:

Abra o VWD 2010 Express e crie um novo web site clicando no link New Web Site... ou no menu File -> New Web Site;

Nota: Você sabe qual a diferença entre criar um um New Web Site e criar New Project ?

A seguir selecione a linguagem Visual Basic (você pode escolher C# também), o template ASP .NET Empty Web Site, informe o nome acessoSeguroComDownload e clique em OK;

Como criar um web site vazio temos que incluir uma nova página (um WebForm) no projeto através do menu WebSite->Add New Item, selecione o template WebForm e aceite o nome padrão Default.aspx;

Esta página Default.aspx será usada como a página de Login do site. (eu poderia ter dado o nome de Login.aspx a esta página.)

Vamos aproveitar e incluir também uma outra página chamada Download.aspx da mesma forma. Essa página será usada para exibir os arquivos para donwload.

Vamos então definir nesta página os controles para solicitar que o usuário informe o login (nome do usuário) e a sua senha previamente cadastrada.

No menu Table->Insert Table , inclua uma tabela com 5 linhas e 2 colunas e inclua na página os seguintes controles:

Conforme o leiaute abaixo:

Como já deu para perceber o usuário terá que informar um nome de login e a senha previamente cadastrados. Portanto temos que ter essas informações persistidas em algum lugar: um arquivo xml, um arquivo texto, um banco de dados, etc.

No nosso exemplo eu vou criar um banco de dados para armazenar as informações do usuário. Para criar o banco de dados vou usar a ferramenta SQL Server Management Studio Express;

Abra o SQL Server Management Studio e clique na opção New Query para executar as seguintes consultas:

  1. Criar o banco de dados Acesso : Create DataBase Acesso
  2. Criar a tabela Log_Usuarios : Create TABLE [dbo].[Log_Usuarios]

Para executar as consultas clique no botão ! Execute;

Create DataBase Acesso

use Acesso

CREATE TABLE [dbo].[Log_Usuarios]
(
[Logid] [int] IDENTITY(100,1)PRIMARY KEY NOT NULL,
[nome] [varchar](55) NOT NULL,
[senha][varchar](55),
[horaLogin] [datetime] NOT NULL,
[hotaLogout] [datetime] NOT NULL,
[Status] [int] NOT NULL,
[DataLogin] [datetime] NOT NULL,
[email] [varchar](55) NOT NULL
)

A seguir vamos incluir dois registros na tabela Log_Usuarios executando as instruções abaixo :


insert into dbo.Log_Usuarios values('Macoratti','numsey',GETDATE(),'02/07/2010',1,GETDATE(),'macoratti@yahoo.com')
insert into dbo.Log_Usuarios values('Jessica','123456',GETDATE(),'02/09/2010',1,GETDATE(),'jessica@teste.com')

Ao final a nossa tabela deverá exibir os seguintes registros:

Pronto já temos o nosso banco de dados Acesso e nossa tabela Log_Usuarios prontas e com dois usuários cadastrados.

Agora vamos usar uma stored procedure spLoginv que irá validar o login e retornar um valor inteiro:

Create Proc [dbo].[spLoginv]
(
@usuario VarChar(50), 
@password varChar(50),
@resultado int OUTPUT
)
AS
set @resultado = (SELECT count(*) FROM Log_Usuarios
WHERE nome = @usuario And senha = @password)
select case @resultado
when 1 then 1 --Login esta Correto
else
0 -- Login incorreto
end 

Nesta stored procedure estamos contando os registros que coincidem com os valores de usuário e se senha informados na página de login, e, se existir um registro que coincida com as credencias informadas, então temos que o login esta correto; se não houver nenhum registro que coincida com as credenciais informadas será retornado o valor zero;

Na figura abaixo temos a criação da stored procedure no SQL Server Management Studio :

Agora temos que criar uma função que vai usar a stored procedure spLoginv chamando-a no evento Click do botão Login verificando o retorno obtido e tratando o resultado.

Abra o arquivo code-behind do arquivo Default.aspx.vb vamos definir a função Valida_Login cujo código é o seguinte:

 Public Function Valida_Login(ByVal nomeUsuario As [String], ByVal senhaUsuario As [String]) As Integer

        Dim strConn = "Data Source=.\SQLEXPRESS;Initial Catalog=Acesso;Integrated Security=True"

        Dim con As New SqlConnection(strConn)
        Dim cmdselect As New SqlCommand()

        cmdselect.CommandType = CommandType.StoredProcedure
        cmdselect.CommandText = "[dbo].[spLoginv]"

        cmdselect.Parameters.Add("@usuario", SqlDbType.VarChar, 50).Value = nomeUsuario
        cmdselect.Parameters.Add("@password", SqlDbType.VarChar, 50).Value = senhaUsuario
        cmdselect.Parameters.Add("@resultado", SqlDbType.Int, 4)
        cmdselect.Parameters("@resultado").Direction = ParameterDirection.Output
        cmdselect.Connection = con

        Dim Retorno As Integer = 0
        Try
            con.Open()
            cmdselect.ExecuteNonQuery()
            Retorno = CInt(cmdselect.Parameters("@resultado").Value)
        Catch ex As SqlException
            lblaviso.Text = ex.Message
        Finally
            cmdselect.Dispose()
            If con IsNot Nothing Then
                con.Close()
            End If
        End Try
        Return Retorno
    End Function

Esta função define a string e conexão com o banco de dados (seria melhor que ela fosse obtida do arquivo web.config, não é mesmo???);

A seguir a função define a stored procedure que vai usar, spLoginv, e, os parâmetros recebidos : nomeUsuario e senhaUsuario;

A função executa a stored procedure e retorna o valor retornado pelo resultado da execução : zero ou um;

Não esqueça definir no início do arquivo os namespaces para acessar as classes ADO .NET;

Imports System.Data
Imports System.Data.SqlClient

No evento Click do botão Login vamos incluir o código que vai usar a função Valida_Login:

 Protected Sub btnLogin_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnLogin.Click

        Dim Resultado As Integer = 0
     
         If txtUsuario.Text <> "" AndAlso txtSenha.Text <> "" Then
            Resultado = Valida_Login(txtUsuario.Text, txtSenha.Text)
        Else
            lblaviso.Text = "Informe o nome e a senha corretos."
        End If
        If Resultado = 1 Then
             lblaviso.Text = "acesso concedido"
             Response.Redirect("Download.aspx")
        Else
            lblaviso.Text = "Login inválido"
        End If
    End Sub

Este código utiliza a função Valida_Login() passando o nome e senha do usuário e obtendo o retorno da stored procedure que criamos.

Se o resultado for igual a 1 então o usuário é valido e estamos redirecionando-o para a página Download.aspx que criamos no início do artigo.

Executando a aplicação temos abaixo a página Default.aspx solicitando o nome e a senha do usuário;

Dessa forma criamos o banco de dados, a stored procedure e a página de login. Na segunda parte deste artigo vamos exibir na página de download os arquivos para download e definir o código para realizar o download do arquivo selecionado.

Aguarde a continuação do artigo: ASP .NET - Acesso seguro com download de arquivos na web - 2

Eu sei é apenas ASP .NET, mas eu gosto.

Simples, simples assim...

Referências:

José Carlos Macoratti