Archive for the ‘ASP.NET’ Category.

Autenticação ASP.NET Personalizada – Usando Rules

Ola Pessoal

Muita gente pergunta como criarmos um sistema de autenticação eficiente em ASP.NET, sem utilizar Profile e a estrutura de tabelas própria do ASP.NET. Pois bem vou mostrar aqui uma maneira bem simples de criar este sistema de forma personalizada utilizando também regras de acesso.

Bom para efetuar nossa exmplicação vamos partir de um exemplo real. Imaginando que criamos uma estrutura de tabelas em nosso banco capaz de armazenar as informações dos usuários, como dados básicos e perfis de acesso, esta estrutura pode ser modelada da maneira que preferir. Abaixo vou citar um exemplo:

image

Neste exemplo simples criamos uma tabela de usuários, uma tabela de perfil que irá armazenar as regras de acesso, e uma tabela UsuarioxPerfil que vamos relacionar as regras de acesso de cada usuário para o sistema.

Agora precisamos criar nossa código para autenticação. Primeiro criamos algumas procedures de consulta as informações, seguindo nosso exemplo criamos uma procedure exemplo para o retorno des dados do usuário:

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:        Adriano Bertucci
-- Create date: 02 de janeiro de 2009
-- Description:    Busca Informações para login no sistema
-- =============================================
ALTER PROCEDURE [dbo].[CPBB_Logar]
    @Login as varchar(20),
    @Senha as varchar(50)
AS
BEGIN
    SET NOCOUNT ON;

    --Retorna as Regras(Perfil) caso o usuário e senha sejam válidos
    SELECT P.PerfilId,P.Nome FROM Usuario U
    LEFT JOIN UsuarioxPerfil UP
    ON U.UsuarioId = UP.UsuarioId
    LEFT JOIN  Perfil P
    ON UP.PerfilId = P.PerfilId
    WHERE U.Login = @Login and U.Senha = @Senha

END

Acima temos o código de uma simples procedure que ira retornar as regras de acesso do usuário de acordo com a validação de usuário e senha.

Agora vamos ao código .NET, com nosso projeto ASP.NET criado usaremos os métodos de autenticação do próprio ASP.NET. Como primeiro passo criei um componente de login que o qual colocarei o código de autenticação conforme descrito abaixo:

protected void btnLogar_Click(object sender, ImageClickEventArgs e)
{
    //Busca os controles com o usuário e senha digitados pelo usuário
    string Login = ((TextBox)LoginView.FindControl("txtLogin")).Text;
    string Senha = ((TextBox)LoginView.FindControl("txtSenha")).Text;

    //Executa a função logar a qual dispara a procedure e retorna
    //o perfil de acesso
    string Perfil = CPBB.Servico.Usuario.Logar(Login, Senha);

    //Verifica o retorno do login
    if (!String.IsNullOrEmpty(Perfil))
    {
        #region " === Autenticação === "
        //Inicializamos o processo de autenticação
        FormsAuthentication.Initialize();

        //Criamos um ticket com os dados do usuário
        //reparem que passamos inclusive os perfis carregados
        //o ticket será a base da nossa autenticação
        FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, Login, DateTime.Now, 
        DateTime.Now.AddMinutes(Convert.ToInt32(ConfigurationManager.AppSettings["CookieTimeOut"])), 
        false, Perfil, FormsAuthentication.FormsCookiePath);

        //Criptografamos o ticket por questão se segurança
        string hash = FormsAuthentication.Encrypt(ticket);
        //Criamos um cookie(será usado para validação do asp.net)
        HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, hash);
        //Setamos a persistencia do cookie
        if (ticket.IsPersistent) cookie.Expires = ticket.Expiration;

        //Em fim adicionamos o cookie a nossa aplicação.
        Response.Cookies.Add(cookie);
        //Retornamos para a página que foi solicitada
        string returnUrl = Request.QueryString["ReturnUrl"];
        if (returnUrl == null) returnUrl = "/";
        Response.Redirect(returnUrl);
        #endregion
    }
    else
    {
        ScriptManager.RegisterStartupScript(Page, Page.GetType(), "Login", "alert('" + 
                                         Resources.MensagensAlertas.LoginInvalido + "');", true);
    }
}

Apenas como demonstração segue abaixo a função de login a qual é utilizada para a consulta ao banco de dados em nosso exemplo representada por CPBB.Servico.Usuario.Logar(Login, Senha);

public static string Logar(string Login, string Senha)
{
    string Perfil = string.Empty;
    //Consultamos o banco de dados para validar o usuário
    SubSonic.StoredProcedure SP = CPBB.DAL.SPs.CpbbLogar(Login, FormsAuthentication.HashPasswordForStoringInConfigFile(Senha,"sha1"));

    System.Data.DataSet ds = SP.GetDataSet();

    CPBB.DAL.PerfilCollection cperfil = new CPBB.DAL.PerfilCollection();
    cperfil.Load(ds.Tables[0]);

    //Carregamos o(s) perfil(s)
    foreach (CPBB.DAL.Perfil perfil in cperfil)
    {
        Perfil += perfil.Nome + ",";
    }

    cperfil = null;
    SP = null;
    ds.Dispose();
    return Perfil;
}

Bom pessoal, feito isso agora temos que configurar nosso Global.asax, ele será o responsável por carregar os perfis do usuário para que o ASP.NET o reconheça. Vamos ao código:

protected void Application_AuthenticateRequest(Object sender,EventArgs e)
{
    //Verificamos a existencia de um usuário na aplicação
    if (HttpContext.Current.User != null)
    {
        //Se o usuário esta autenticado( passou pelo login inicial )
        if (HttpContext.Current.User.Identity.IsAuthenticated)
        {
            //Usando as classes de Identidade do ASP.NET vamos pegar as regras
            // e carregar para a aplicação
            if (HttpContext.Current.User.Identity is FormsIdentity)
            {
                FormsIdentity id =(FormsIdentity)HttpContext.Current.User.Identity;
                FormsAuthenticationTicket ticket = id.Ticket;

                string userData = ticket.UserData;
                string[] roles = userData.Split(',');
                HttpContext.Current.User = new GenericPrincipal(id, roles);
            }
        }
    }
}

Repare que utilizamos o método Application_AuthenticateRequest do Global.asax, ele é usado sempre que um usuário se autentica na aplicação.

Feito isso agora basta usar as configurações no web.Config para setar o acesso as páginas, como por exemplo:

<location path="admin">
  <system.web>
    <authorization>
      <allow roles="Administrador"/>
      <deny users="*"/>
    </authorization>
  </system.web>
</location>

Bom pessoal tentei demonstrar de maneira rápida de fazer uma autenticação via asp.net usando roles, caso tenha alguma dúvida é só avisar!

Bom divertimento!


Bookmark and Share

Lendo E-mails em servidor Exchange – com Visual C# e Interop

Ola Pessoal,

Tivemos um requisito aqui em uma aplicação pontual, na empresa. Precisavamos ler e trabalhar no geral com as mensagens em um servidor Exchange, mas tudo isso através de uma aplicação ASP.NET com C#.

Depois de rápidas discussões decidimos por uma solução bem simples, usar a dll Microsoft.Office.Interop.Outlook . Esta dll faz com que possamos usar os recursos nativos do outlook, ou seja, se seu outlook estiver com sua conta exchange configurada conseguimos usa-lo para efetuar as tarefas como ler um email por exemplo.

Abaixo vou descrever como ficou esta solução rápida:

  1. Com nossa aplicação ASP.NET criado adicionei a referencia da DLL Microsoft.Office.Interop.Outlook ( a versão depende muito da instalação do Office em sua máquina, procure usar a versão que você ira ter no servidor, afinal sem usaremos o proprio outlook para executar as tarefas)
  2. Agora em nossa página podemos usar o seguinte código como exemplo para ler os email da caixa de entrada configurada no outlook local.
    //Criando uma instancia do outlook
    Application outlook = new ApplicationClass();
    
    //Agora vamos nos autenticar
    NameSpace ns = outlook.GetNamespace("Mapi");
    object _missing = Type.Missing;
    ns.Logon(_missing, _missing, false, true);
    
    //Apenas como exemplo vamos selecionar a Inbox para ler seus e-mails
    MAPIFolder inbox = ns.GetDefaultFolder(OlDefaultFolders.olFolderInbox);
    
    //Exemplo de recurso da DLL, abaixo vemos com identificar quantos emails não lidos ainda
    int unread = inbox.UnReadItemCount;
    
    //Agora podemos fazer um loop e ler todos os emails da pasta selecionada
    foreach (MailItem mail in inbox.Items)
    {
        string body = mail.Body;
        string subject = mail.Subject;
    }

Pessoal este é um pequeno exemplo das inúmeras funcionalidades que podemos usar usando o Interop do Office.

[]s


Bookmark and Share

IsPostBack AJAX

Ola Pessoal,

Estes dias várias pessoas me perguntaram como eu verificava em minha aplicação ASP.NET, se a mesma esta disparando um Postback de AJAX. Respondendo a estas perguntas abaixo segue as instruções de como fazer esta verificação.

Primeiro temos que lembrar e saber que apesar da pagina não se “recarregar” por compempleta apenas atualizar a área “isolada” por um Update Panel… ela executa sim um postback em nossa página. Porem ao invés de ser um PostBack tradicional podemos dizer que ele executa um “PostBack de AJAX”.

Para identificar via código este postback também temos diferença:

A verificação de um postback tradicional podemos exemplicar através do código:

if (!IsPostBack)
{
    //Código a executar
}

Já um postback de ajax podemos identificar através do código:

if(ScriptManager.GetCurrent(Page).IsInAsyncPostBack)
{
    //Código a executar
}

Reparem que através da classe ScriptManager consegimos identificar na página corrente um AsyncPostBack que é disparado graças a um chamada AJAX.

[]’s


Bookmark and Share

Treinamentos Microsoft Expression

Ola Pessoal,

 

Voltando aos nossos posts após ao ON THE BEACH IV… Vamos começar como uma grande dica… A Microsoft lançou um site com uma série de treinamentos em Microsoft Expression, trata-se de uma série de vídeos que demonstram entre outras coisas como por exemplo, migrar um site atual para padrões Web Standarts W3C.

Para quem quiser conferir acesse: http://expression.microsoft.com/en-us/cc136535.aspx

[]s


Bookmark and Share

Listando arquivos de um diretório com Visual C#

Ola Pessoal,

Uma pequena dica técnica… Para que precisar trabalhar com arquivos e diretórios o .NET Framework possui grandes recursos dentro de seu Namespace: System.IO.

Agora vou dar um pegueno exemplo de como listar os arquivos de um determinado diretório fisíco. Para isso a primeira ação que devemos executar é importar nosso NameSpace:

using System.IO;

Logo em seguida iremos utilizar as classes DirectoryInfo e FileInfo, para que possamos listar os arquivos. Abaixo segue um exemplo comentado sobre o assunto:

//Marca o diretório a ser listado
DirectoryInfo diretorio = new DirectoryInfo(@"C:\");
//Executa função GetFile(Lista os arquivos desejados de acordo com o parametro)
FileInfo[] Arquivos = diretorio.GetFiles("*.*");

//Começamos a listar os arquivos
foreach (FileInfo fileinfo in Arquivos)
{
    Response.Write(fileinfo.Name);
}

Bom pessoal, espero que aproveitem mais esta dica!


Bookmark and Share

Treinamento de Silverlight 2.0 – DVD – Gratuito

Ola Pessoal,

Para que é fã de Silverlight, ou que começar a ser :) a Microsoft disponibilizou um mega treinamento em DVD para download, portanto quem quiser basta fazer o download em Treinamento de Silverlight 2.0 é grande… mas vale a pena pelo conteúdo.

Uma observação dilvulgue avontade! :)

 

[]‘s


Bookmark and Share

Componentes e Produtos para Desenvolvimento de Softwares

Ola Pessoal,

Gostaria de comunicar a todos que a apartir de hoje vou inaugurar uma nova área neste site, uma área especifica para Produtos e Componentes para desenvolvimento de softwares e negócio em geral.

Trata-se de uma iniciativa, que reune os pricipais profissionais de tecnologia do setor, através da AB Software, que agora trará as principais novidades em produtos e componentes, todos desenvolvidos com a mais alta tecnologia.

Para começar a equipe AB Software, disponibilza totalmente gratuíta, um componente para envio de Email sem autenticação o ABSoftware.Mail uma tremenda novidade para os desenvolvedores de aplicações .NET.

Portanto agora é só acessar nossa página http://www.adrianobertucci.com/page/Produtos.aspx e acompanhar as novidades. Qualquer dúvida quanto ao uso do produto basta entrar em contato através do link http://www.adrianobertucci.com/contact.aspx

 

[]‘s


Bookmark and Share

Identificando a cultura e idioma do cliente – ASP.NET e C#

Ola Pessoal,

Vamos com mais uma dica que ainda gera muitas dúvidas. Quando estamos trabalhando com multiplos idiomas em aplicações web, muitas pessoas se perguntam como identificar as configurações, e a própria cultura do usuário que esta acessando o site naquele momento. Para isso o .NET Framework nos oferece recursos para identificarmos tudo. Vamos ver como funciona:

Thread.CurrentThread.CurrentCulture

Através da classe Thread, temos acesso a todas as informações sobre a thread corrente, inclusive informações completas quanto a Cultura do usuário. Com elas podemos acessar literalmente todas as informações sobre o idioma corrente como por exemplo formatos de data e hora local.

Por enquanto é só! Qualquer coisa só me comunicar!

[]´s


Bookmark and Share

Criptografando Senhas (HASH) em ASP.NET e C#

Ola Pessoal,

Para facilitar nossa vida e sempre melhorarmos a segurança de nossa aplicações, o .NET Framework nos fornece funcionalidades nativas para criarmos criptografia para senhas. Portanto ao invés de armazenarmos uma senha em banco de dados sem nenhuma segurança seguer podemos antes pelo menos criptografar ela. Abaixo vamos demostrar um exemplo simples para solucionar este problema:

Primeiramente para usarmos a função temos que importar o namespace:

using System.Web.Security;

Logo em seguida podemos usar uma função já pronta do próprio .NET Framework, função esta que pede como parametros, o texto a ser criptografado, neste caso a nossa senha, e claro o algoritmo de criptografia. No exemplo utilizo o SHA-1 mas poderiamos usar também, por exemplo, o MD5. Vamos ao código:

public static class Seguranca
{
	//Função criada como Extension Methods C# 3.0    
	public static string CripitografaSenhaHASH(this string Senha)
{
//A HashPasswordForStoringInConfigFile já nos retorna uma string com o valor criptografado.
return FormsAuthentication.HashPasswordForStoringInConfigFile(Senha, “sha1″);
	}
}

Como podemos ver é bem simples. Pessoal só lembrando que este é apenas um exemplo, já que o Framework nos proporciona mais N maneiras de se criptografar dados. Por isso avalei o nível de segurança da aplicação e escolha qual é a melhor opção para ela.


Bookmark and Share

Envio de E-mail – C#, ASP.NET Framewrok – Manual

Mais uma dica para completar o dia, estou desenvolvendo um sistema de envio de email, aqui no serviço, então estou pesquisando muito sobre o assunto, e nestas pesquisas achei uma manual completo sobre o assunto, mostrando o funcionamento das classes do .NET Framewrok, e também padrões e regras para envio de email.

Quem precisar e quiser consultar http://www.systemwebmail.com/


Bookmark and Share