ID do artigo: 910440 - Última revisão: quinta-feira, 22 de novembro de 2007 - Revisão: 1.4

Usando controles de logon para uma fonte de dados existente, criando um provedor de associação personalizado no ASP.NET 2.0

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.
Coluna de voz de suporte do ASP.NET

Usando controles de logon para uma fonte de dados existente, criando um provedor de associação personalizado no ASP.NET 2.0

para personalizar esta coluna às suas necessidades, queremos convidá-lo para enviar suas idéias sobre tópicos que interessam a você e problemas que você deseja ver abordados artigos do Knowledge Base no futuro e colunas de voz de suporte. Você pode enviar suas idéias e comentários usando o formulário Ask For It (http://support.microsoft.com/common/survey.aspx?scid=sw;en;1176&p0=&p1=&p2=&p3=&p4=) . Há também um link para o formulário na parte inferior desta coluna.

Nesta página

Expandir tudo | Recolher tudo

Introdução

Saudação e de volta bem-vindo! Meu nome é Parag Agarwal, e eu sou um engenheiro de suporte aqui na Microsoft. Este mês, vamos abordar outro recurso interessante no Microsoft ASP.NET 2.0, gerenciando provedores para controles de logon.

Visão geral

Na coluna deste mês, Falarei sobre os tópicos a seguir:
  • Visão geral sobre controles de login
  • Visão geral sobre o modelo de provedor no ASP.NET 2.0
  • Passo a passo sobre como criar um provedor personalizado que pode ser usada por controles de logon com uma fonte de dados existente

Controles de login

É um requisito muito comum ter funcionalidade de login em quase todos os aplicativos Web. Antes do lançamento do ASP.NET 2.0, é usado para criar interfaces do usuário (UI) para autenticar o usuário. Isso envolveu a escrever muito código redundante. Para evitar isso, o ASP.NET 2.0 fornece uma solução logon completo na forma de uma série de controles de servidor para aplicativos Web que não exigem nenhuma programação. Internamente, esses controles são responsáveis por processar a interface apropriada onde um usuário pode inserir suas credenciais e validá-los. Agora, não temos que criar a interface do usuário como um desenvolvedor de página, e não é necessário cuidar da autenticação do usuário escrevendo nosso próprio código. O modelo de provedor subjacente usado pelo controle login cuida do que. Veremos como o controle login usa os provedores para autenticar o usuário na próxima seção. Você pode encontrar mais informações sobre controles de logon e como podemos usá-los no seguinte site:
http://msdn2.microsoft.com/en-us/library/ms178329.aspx (http://msdn2.microsoft.com/en-us/library/ms178329.aspx)

Modelo de provedor

O modelo de provedor permite aos desenvolvedores criar software conectável. Basicamente destina-se a desacoplar uma abstração da implementação para que ambas as partes podem variar de forma independente. Para fazer isso, o ASP.NET fornece determinadas classes base abstratas que todas as propriedades necessárias para ser implementado pela classe deriving que fornece a implementação para esses métodos e propriedades têm métodos abstratos.

Para obter mais informações sobre classes base abstratas, visite o seguinte site:
http://msdn2.microsoft.com/en-us/library/k535acbf(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/k535acbf(vs.71).aspx)
Portanto, para resumir, provedores são usados como intermediários pelos controles para interagir com um armazenamento de dados. Eles fornecem abstração entre o aplicativo e a fonte de dados da mesma maneira drivers de dispositivo fornecem abstração de um dispositivo de hardware.

Porque este artigo fala sobre provedores de associação, discutiremos o que classes ASP.NET 2.0 fornece para o recurso de associação. O recurso de associação do ASP.NET 2.0 define uma classe base abstrata chamada classe MembershipProvider . Além disso, MembershipProvider deriva de uma classe base diferente chamada a classe ProviderBase , que é uma classe comum a todos os provedores. Portanto, os desenvolvedores podem criar suas próprias classes de provedor derivando da classe MembershipProvider existente.

Para obter mais informações sobre as classes MembershipProvider e ProviderBase , visite os seguintes sites:
http://msdn2.microsoft.com/en-us/library/system.web.security.membershipprovider.aspx (http://msdn2.microsoft.com/en-us/library/system.web.security.membershipprovider.aspx)

http://msdn2.microsoft.com/en-us/library/system.configuration.provider.providerbase.aspx (http://msdn2.microsoft.com/en-us/library/system.configuration.provider.providerbase.aspx)
Depois que nós tenha definido o provedor de associação, ele deve ser descrito em um arquivo de configuração em Machine.config (para todos os aplicativos de Web) ou no Web.config (para um aplicativo Web específico). O provedor apropriado é instanciado em tempo de execução a partir de informações fornecidas no arquivo de configuração pelo ASP.NET. No entanto, é possível alterar o provedor dinamicamente em tempo de execução bem.

Para obter mais informações sobre como especificar as definições de configuração de um provedor de associação, visite o seguinte site da Web:
http://msdn2.microsoft.com/en-us/library/ms178329.aspx (http://msdn2.microsoft.com/en-us/library/ms178329.aspx)
Agora, o controle login é fornecido com dois provedores de associação interna que usam uma estrutura de dados/esquema de dados específicos: No entanto, se quisermos trabalhar com uma estrutura de banco de dados existente, pode facilmente código um provedor de associação personalizado para obter controles de login para falar com a antiga estrutura de banco de dados.

Criar um provedor de associação personalizado

Agora que temos informações suficientes sobre controles de logon e o modelo de provedor subjacente que eles usam, vamos criar um provedor de associação personalizado para obter controles de logon existentes para funcionar em um armazenamento de dados personalizado.

Observação O provedor personalizado usará um banco de dados SQL Server chamado TestDB . TestDB terá uma tabela denominada usuários com os campos UserID, UserName e senha e outras informações, como ID de email e endereço.
  1. Inicie o Microsoft Visual Studio 2005.
  2. Crie um projeto de biblioteca de classe e dê a ele um nome, por exemplo, CustomMembershipProviderLib.
  3. Adicione um arquivo fonte para o projeto, for example, CustomMembershipProvider.cs.
  4. Incluem System.Web e System.Configuration na seção de referências.
  5. Verifique se que os namespaces a seguir estão incluídos na CustomMembershipProvider.cs arquivo
    using System;
    using System.Web;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web.Security;
    using System.Collections.Specialized;
    using System.Data.SqlClient;
  6. Herdar a classe CustomMembershipProvider com class. MembershipProvider
    class CustomMembershipProvider : 
    MembershipProvider
  7. Como nós já sabemos, MembershipProvider é uma classe abstrata, portanto, precisamos substituir todos os métodos abstratos na classe CustomMembershipProvider . Há um recurso muito interessante no Visual Studio 2005 que faz isso automaticamente. Tão logo você estender qualquer classe abstrata, basta clicar classe abstrata com o botão direito do mouse e clique em Implementar classe abstrata . Isso automaticamente coloca declarações para todos os métodos abstratos. Você irá notar que o corpo para cada método contém uma linha de código comum.
    throw new Exception("The method or operation is not implemented.");
    Isso indica quais recursos são suportados pelo provedor personalizado.

    Observação Implementação para o método Initialize é obrigatória.
  8. O provedor personalizado, se concentrará em fornecer alguns recursos, como o seguinte:
    • Criar um novo usuário, usando o controle CreateUserWizard
    • Validação das credenciais do usuário utilizando o controle login
    Nós implementará esses recursos, uma a uma. Primeiro, implemente o método Initialize . Esse método é chamado pelo ASP.NET quando o provedor é carregado. Além disso, os provedores são carregados quando o aplicativo usa-los pela primeira vez, e eles são criados uma vez por domínio de aplicativo.
    public override void Initialize(string name,NameValueCollection config)
    {
        // Verify that config isn't null
        if (config == null)
            throw new ArgumentNullException("config");
    
        // Assign the provider a default name if it doesn't have one
        if (String.IsNullOrEmpty(name))
            name = "AspNetCustomMembershipProvider";
    
        // Add a default "description" attribute to config if the
        // attribute doesn't exist or is empty
        if (string.IsNullOrEmpty(config["description"]))
        {
            config.Remove("description");
            config.Add("description", "Custom SQL Provider");
        }
    
        // Call the base class's Initialize method
        base.Initialize(name, config);
    }
  9. Em seguida, implemente o método ValidateUser . Ele usa o nome de entrada de usuário e senha e verificará se a fonte de dados de associação contém um nome de usuário correspondente e uma senha. Se o método retorna true, o controle login permite ao usuário passar a verificação. Caso contrário, ele solicita as credenciais novamente.
    public override bool ValidateUser(string username, string password)
    {
        SqlConnection cnn = null;
        SqlCommand cmd = null;
        bool userExists = true;
        try
        {
            cnn = new SqlConnection();
            cnn.ConnectionString = "connection string for the existing data source";
            cnn.Open();
            string selectQry = "Select query for username and password";
            cmd = new SqlCommand(selectQry, cnn);
            SqlDataReader rdr = cmd.ExecuteReader();
            if (!rdr.Read())
                userExists = false;
        }
        catch (Exception ex)
        {
            throw ex;
        }
        finally
        {
            cmd.Dispose();
            cnn.Close();
        }
        return userExists;
    }
  10. Implemente um método mais chamado CreateUser que é chamado pelo controle CreateUserWizard . Ela usa entrada, como nome de usuário, senha, endereço de email e outras informações e adiciona um novo usuário à fonte de dados de associação existente. Ele retorna o objeto MembershipUser , que representa um usuário recém-criado. Ele também define MembershipCreateStatus , que informa se o usuário foi criado com êxito. Se o usuário não foi criado com êxito, podemos especificar o motivo.
    public override MembershipUser CreateUser(string username, string
              password, string email, string passwordQuestion, string
              passwordAnswer, bool isApproved, object providerUserKey,
              out MembershipCreateStatus status)
    {
        SqlConnection cnn = null;
        SqlCommand cmd = null;
        MembershipUser newUser = null;
        try
        {
            cnn = new SqlConnection();
            cnn.ConnectionString = "connection string for the existing data source";
            cnn.Open();
            string insertQry = "Prepare the Insert query...";
            cmd = new SqlCommand(insertQry, cnn);
            cmd.ExecuteNonQuery();
    
            // Right now I am giving default values for DateTime
            // in Membership constructor.
            newUser = new MembershipUser(
            "AspNetCustomMembershipProvider",
            username, null, String.Empty, String.Empty,
             String.Empty, true, false, DateTime.Now,
             DateTime.Now, DateTime.Now, DateTime.Now,
             DateTime.Now
            );
            status = MembershipCreateStatus.Success;
        }
        catch (Exception ex)
        {
            status = MembershipCreateStatus.ProviderError;
            newUser = null;
            throw ex;
        }
        finally
        {
            cmd.Dispose();
            cnn.Close();
        }
        return newUser;
    }
  11. O restante da aparência de métodos como aquelas fornecidas abaixo. Se desejar, você pode implementar qualquer uma delas.
    // MembershipProvider Properties
    public override string ApplicationName
    {
        get { throw new NotSupportedException(); }
        set { throw new NotSupportedException(); }
    }
    
    public override bool EnablePasswordRetrieval
    {
        get { return false; }
    }
    
    public override bool EnablePasswordReset
    {
        get { return false; }
    }
    
    public override int MaxInvalidPasswordAttempts
    {
        get { throw new NotSupportedException(); }
    }
    
    public override int MinRequiredNonAlphanumericCharacters
    {
        get { throw new NotSupportedException(); }
    }
    
    public override int MinRequiredPasswordLength
    {
        get { throw new NotSupportedException(); }
    }
    
    public override int PasswordAttemptWindow
    {
        get { throw new NotSupportedException(); }
    }
    
    public override MembershipPasswordFormat PasswordFormat
    {
        get { throw new NotSupportedException(); }
    }
    
    public override string PasswordStrengthRegularExpression
    {
        get { throw new NotSupportedException(); }
    }
    
    public override bool RequiresQuestionAndAnswer
    {
        get { return false; }
    }
    
    public override bool RequiresUniqueEmail
    {
        get { return false; }
    }
    
    public override MembershipUser GetUser(string username,
        bool userIsOnline)
    {
        throw new NotSupportedException();
    }
    
    public override MembershipUserCollection GetAllUsers(int pageIndex,
        int pageSize, out int totalRecords)
    {
        throw new NotSupportedException();
    }
    
    public override int GetNumberOfUsersOnline()
    {
        throw new NotSupportedException();
    }
    
    public override bool ChangePassword(string username,
        string oldPassword, string newPassword)
    {
        throw new NotSupportedException();
    }
    
    public override bool
        ChangePasswordQuestionAndAnswer(string username,
        string password, string newPasswordQuestion,
        string newPasswordAnswer)
    {
        throw new NotSupportedException();
    }
    
    public override bool DeleteUser(string username,
        bool deleteAllRelatedData)
    {
        throw new NotSupportedException();
    }
    
    public override MembershipUserCollection
        FindUsersByEmail(string emailToMatch, int pageIndex,
        int pageSize, out int totalRecords)
    {
        throw new NotSupportedException();
    }
    
    public override MembershipUserCollection
        FindUsersByName(string usernameToMatch, int pageIndex,
        int pageSize, out int totalRecords)
    {
        throw new NotSupportedException();
    }
    
    public override string GetPassword(string username, string answer)
    {
        throw new NotSupportedException();
    }
    
    public override MembershipUser GetUser(object providerUserKey,
        bool userIsOnline)
    {
        throw new NotSupportedException();
    }
    
    public override string GetUserNameByEmail(string email)
    {
        throw new NotSupportedException();
    }
    
    public override string ResetPassword(string username,
        string answer)
    {
        throw new NotSupportedException();
    }
    
    public override bool UnlockUser(string userName)
    {
        throw new NotSupportedException();
    }
    
    public override void UpdateUser(MembershipUser user)
    {
        throw new NotSupportedException();
    }
  12. Compile o projeto de biblioteca de classe. Ele irá gerar a DLL de saída.
  13. Abra um site existente ou crie um novo site.
  14. Adicione a referência DLL no site da Web.
  15. Registre o provedor no arquivo Web.config da seguinte maneira.
    <membership defaultProvider="AspNetCustomMembershipProvider">
      <providers>
        <clear />
        <add  name="AspNetCustomMembershipProvider"	type="CustomMembershipProvider"/>
      </providers>
    </membership>
  16. Adicione uma página Web Forms chamada Login.aspx onde o controle login pode ser usado.
    <form id="Form1" runat="server">
      <div>
        <asp:Login ID="Login1" runat="server"></asp:Login>
      </div>
    </form>
  17. Adicione outra página de Web Forms chamada CreateUser.aspx onde o controle CreateUserWizard pode ser usado.
    <form id="Form1" runat="server">
      <div>
        <asp:CreateUserWizard ID="CreateUserWizard1" runat="server"></asp:CreateUserWizard>
      </div>
    </form>
  18. Executar ambas as páginas de Web Forms, e você verá a saída.
Se você não estiver usando o Visual Studio, você pode executar as seguintes etapas:
  1. Abra qualquer editor de texto.
  2. Crie um arquivo chamado CustomMembershipProvider.cs e siga as instruções fornecidas nas etapas 5 a 17.
  3. Crie um diretório na pasta wwwroot.
  4. Iniciar Microsoft Internet Information Services (IIS) Gerenciador e marca a nova pasta como o diretório raiz virtual. Além disso, verifique se ele está configurado para execução sob o Microsoft .NET Framework 2.0, no caso de outra versão do .NET Framework está instalada no computador.
  5. Copie as páginas de Web Forms e Web.config nesse diretório.
  6. Crie uma pasta App_Code sob o novo diretório.
  7. Copie o arquivo CustomMembershipProvider.cs no App_Code pasta.
  8. Execute a página CreateUser.aspx Web Forms no Gerenciador do IIS.

Conclusão

Isso é tudo para agora nos provedores de associação personalizado. Espero que esta coluna ajudará a compreender as noções básicas de criação de provedores de associação personalizado e como eles fornecem abstração para o usuário final.

Obrigado por seu tempo. Esperamos que escrever mais sobre os provedores que são fornecidos pelo ASP.NET 2.0 e como é possível estendê-las para personalizar seu comportamento de acordo com a nossas necessidades.

Para obter mais informações sobre provedores, visite os seguintes sites:
Provedor Toolkit
http://msdn2.microsoft.com/en-us/asp.net/aa336558.aspx (http://msdn2.microsoft.com/en-us/asp.net/aa336558.aspx)

Provedor Padrão de design de modelo e especificações, parte 1
http://msdn2.microsoft.com/en-us/library/ms972319.aspx (http://msdn2.microsoft.com/en-us/library/ms972319.aspx)

Provedor Design padrão, parte 2
http://msdn2.microsoft.com/en-us/library/ms972370.aspx (http://msdn2.microsoft.com/en-us/library/ms972370.aspx)
Como sempre, vontade enviar idéias sobre tópicos desejado no futuro abordada colunas ou na Base de dados de Conhecimento usando o formulário Ask For It (http://support.microsoft.com/common/survey.aspx?scid=sw;en;1176&p0=&p1=&p2=&p3=&p4=) .

A informação contida neste artigo aplica-se a:
  • Microsoft ASP.NET 2.0
Palavras-chave: 
kbmt kbprogramming kbsecurity kbcode kbhowto KB910440 KbMtpt
Tradução automáticaTraduçã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 traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 910440  (http://support.microsoft.com/kb/910440/en-us/ )
Retired KB ArticleAviso de Isenção de Responsabilidade sobre Conteúdo do KB Aposentado
Este artigo trata de produtos para os quais a Microsoft não mais oferece suporte. Por esta razão, este artigo é oferecido "como está" e não será mais atualizado.