Implementar um provedor de armazenamento personalizado de MySQL da Identidade do ASP.NET

por Raquel Soares De Almeida, Suhas Joshi, Tom FitzMacken

ASP.NET Identity é um sistema extensível que permite criar seu próprio provedor de armazenamento e conectá-lo ao seu aplicativo sem trabalhar novamente no aplicativo. Este tópico descreve como criar um provedor de armazenamento MySQL para ASP.NET Identity. Para obter uma visão geral da criação de provedores de armazenamento personalizados, consulte Visão geral dos provedores de armazenamento personalizado para ASP.NET Identidade.

Para concluir este tutorial, você deve ter Visual Studio 2013 com a Atualização 2.

Este tutorial será:

  • Mostre como criar uma instância de banco de dados MySQL no Azure.
  • Mostre como usar uma ferramenta de cliente MySQL (MySQL Workbench) para criar tabelas e gerenciar seu banco de dados remoto no Azure.
  • Mostre como substituir a implementação de armazenamento de identidade padrão ASP.NET por nossa implementação personalizada em um projeto de aplicativo MVC.

Este tutorial foi originalmente escrito por Raquel Soares De Almeida e Rick Anderson ( @RickAndMSFT ). O projeto de exemplo foi atualizado para a Identidade 2.0 por Suhas Joshi. O tópico foi atualizado para a Identidade 2.0 por Tom FitzMacken.

Baixar o projeto concluído

No final deste tutorial, você terá um projeto de aplicativo MVC com ASP.NET Identity trabalhando com um banco de dados MySQL hospedado no Azure.

Você pode baixar o provedor de armazenamento MySQL concluído em AspNet.Identity.MySQL (GitHub).

As etapas que você executará

Neste tutorial, você irá:

  1. Criar um banco de dados MySQL no Azure
  2. Criar as tabelas de identidade ASP.NET no MySQL
  3. Criar um aplicativo MVC e configurá-lo para usar o provedor MySQL
  4. Executar o aplicativo

Este tópico não aborda a arquitetura do ASP.NET Identity e as decisões que você deve tomar ao implementar um provedor de armazenamento do cliente. Para obter essas informações, consulte Visão geral dos provedores de armazenamento personalizados para ASP.NET Identity.

Examinar classes do provedor de armazenamento MySQL

Antes de entrar nas etapas para criar o provedor de armazenamento MySQL, vamos examinar as classes que compõem o provedor de armazenamento. Você precisará de classes que gerenciem as operações de banco de dados e as classes que são chamadas do aplicativo para gerenciar usuários e funções.

Classes de armazenamento

  • IdentityUser – contém propriedades para o usuário.
  • UserStore – contém operações para adicionar, atualizar ou recuperar usuários.
  • IdentityRole – contém propriedades para funções.
  • RoleStore – contém operações para adicionar, excluir, atualizar e recuperar funções.

Classes de camada de acesso a dados

Para este exemplo, as classes de camada de acesso a dados contêm instruções SQL para trabalhar com as tabelas; no entanto, no código, talvez você queira usar o ORM (mapeamento relacional de objeto), como Entity Framework ou NHibernate. Em particular, seu aplicativo pode ter um desempenho ruim sem um ORM que inclua carregamento lento e cache de objetos.

  • MySQLDatabase – contém a conexão de banco de dados MySQL e os métodos para executar operações de banco de dados. UserStore e RoleStore são instanciados com uma instância dessa classe.
  • RoleTable – contém operações de banco de dados para a tabela que armazena funções.
  • UserClaimsTable – contém operações de banco de dados para a tabela que armazena declarações de usuário.
  • UserLoginsTable – contém operações de banco de dados para a tabela que armazena informações de logon do usuário.
  • UserRoleTable – contém operações de banco de dados para a tabela que armazena quais usuários são atribuídos a quais funções.
  • UserTable – contém operações de banco de dados para a tabela que armazena usuários.

Criar uma instância de banco de dados MySQL no Azure

  1. Faça logon no Portal do Azure.
  2. Clique em +NOVO na parte inferior da página e selecione STORE.
    Imagem mostrando como acessar o repositório do Portal do Azure
  3. No assistente Escolher e Adicionar , selecione Limpar Banco de Dados MySQL do ClearDB e clique na próxima seta na parte inferior direita da caixa de diálogo.
    Imagem exibindo o anúncio Limpar Banco de Dados do My S Q L do D B
  4. Mantenha o plano gratuito padrão e altere o Nome para IdentityMySQLDatabase. Selecione a região mais próxima de você e clique na próxima seta.
    Imagem do plano gratuito selecionado e nome
  5. Clique na marca de seleção para concluir a criação do banco de dados.
    Imagem de revisão de compra e criação de banco de dados
  6. Depois que o banco de dados tiver sido criado, você pode gerenciá-lo na guia COMPLEMENTOS no portal de gerenciamento.
    Imagem da guia complementos
  7. Você pode obter as informações de conexão do banco de dados clicando em INFORMAÇÕES DE CONEXÃO na parte inferior da página.
    Imagem mostrando o local das informações de conexão
  8. Copie a cadeia de conexão clicando no botão copiar e salve-a para que você possa usá-la posteriormente em seu aplicativo MVC.
    Imagem mostrando cadeia de conexão e U R L

Criar as tabelas ASP.NET Identity em um banco de dados MySQL

Instalar a ferramenta MySQL Workbench para conectar e gerenciar o banco de dados MySQL

  1. Instalar a ferramenta MySQL Workbench na página downloads do MySQL
  2. Inicie o aplicativo e adicione clique no botão MySQLConnections + para adicionar uma nova conexão. Use os dados de cadeia de conexão copiados do banco de dados MySQL do Azure criado anteriormente neste tutorial.
  3. Depois de estabelecer a conexão, abra uma nova guia Consulta ; Cole os comandos de MySQLIdentity.sql na consulta e execute-os para criar as tabelas de banco de dados.
  4. Agora você tem todas as tabelas ASP.NET Identidade necessárias criadas em um banco de dados MySQL hospedado no Azure, conforme mostrado abaixo.
    Imagem mostrando tabelas de identidade necessárias

Criar um projeto de aplicativo MVC a partir do modelo e configurá-lo para usar o provedor MySQL

Se necessário, instale Visual Studio Express 2013 para Web ou Visual Studio 2013 com a Atualização 2.

Baixe o ASP.NET. Projeto Identity.MySQL do GitHub

  1. Navegue até a URL do repositório em AspNet.Identity.MySQL (GitHub).
  2. Baixe o código-fonte.
  3. Extraia o arquivo .zip em uma pasta local.
  4. Abra a solução AspNet.Identity.MySQL e compile-a.

Criar um novo projeto de aplicativo MVC a partir do modelo

  1. Clique com o botão direito do mouse na solução AspNet.Identity.MySQL e em Adicionar, Novo Projeto

  2. Na caixa de diálogo Adicionar Novo Projeto , selecione Visual C# à esquerda e, em seguida, Web e, em seguida, selecione ASP.NET Aplicativo Web. Nomeie seu projeto IdentityMySQLDemo; e clique em OK.

    Imagem da janela de diálogo Adicionar novo projeto

  3. Na caixa de diálogo Novo projeto ASP.NET , selecione o modelo MVC com as opções padrão (que inclui Contas de Usuário Individuais como método de autenticação) e clique em OK. Imagem da nova janela de diálogo do projeto A SP ponto N E T

  4. Em Gerenciador de Soluções, clique com o botão direito do mouse em seu projeto IdentityMySQLDemo e selecione Gerenciar Pacotes NuGet. Na caixa de texto de pesquisa, digite Identity.EntityFramework. Selecione este pacote na lista de resultados e clique em Desinstalar. Você será solicitado a desinstalar o pacote de dependência EntityFramework. Clique em Sim, pois não vamos mais este pacote neste aplicativo.

  5. Clique com o botão direito do mouse no projeto IdentityMySQLDemo, selecione Adicionar, Referência, Solução, Projetos; selecione o projeto AspNet.Identity.MySQL e clique em OK.

  6. No projeto IdentityMySQLDemo, substitua todas as referências a
    using Microsoft.AspNet.Identity.EntityFramework;
    por
    using AspNet.Identity.MySQL;

  7. Em IdentityModels.cs, defina ApplicationDbContext para derivar de MySqlDatabase e inclua um construtor que usa um único parâmetro com o nome da conexão.

    public class ApplicationDbContext : MySQLDatabase
    {
        public ApplicationDbContext(string connectionName)
            : base(connectionName)
        {
        }
    
        public static ApplicationDbContext Create()
        {
            return new ApplicationDbContext("DefaultConnection");
        }
    }
    
  8. Abra o arquivo IdentityConfig.cs. No método ApplicationUserManager.Create , substitua a instanciação de UserManager pelo seguinte código:

    var manager = new ApplicationUserManager(
        new UserStore<ApplicationUser>(
        context.Get<ApplicationDbContext>() as MySQLDatabase));
    
  9. Abra o arquivo web.config e substitua a cadeia de caracteres DefaultConnection por essa entrada substituindo os valores realçados pela cadeia de conexão do banco de dados MySQL que você criou nas etapas anteriores:

    <add name="DefaultConnection" connectionString="Database=IdentityMySQLDatabase;
    Data Source=<DataSource>;User Id=<UserID>;Password=<Password>"
    providerName="MySql.Data.MySqlClient" />
    

Execute o aplicativo e conecte-se ao Banco de Dados MySQL

  1. Clique com o botão direito do mouse no projeto IdentityMySQLDemo e selecione Definir como Projeto de Inicialização

  2. Pressione Ctrl + F5 para compilar e executar o aplicativo.

  3. Clique na guia Registrar na parte superior da página.

  4. Insira um novo nome de usuário e senha e clique em Registrar.

    Imagem mostrando o novo nome de usuário e senha

  5. O novo usuário agora está registrado e conectado.

    Ilustração mostrando que o novo usuário está registrado e conectado

  6. Voltar à ferramenta MySQL Workbench e inspecione o conteúdo da tabela IdentityMySQLDatabase. Inspecione a tabela de usuários para obter as entradas à medida que você registra novos usuários.

    Imagem da ferramenta de inspeção My S Q L Workbench

Próximas etapas

Para obter mais informações sobre como habilitar outros métodos de autenticação neste aplicativo, consulte Criar um aplicativo ASP.NET MVC 5 com o Facebook e o Google OAuth2 e o logon do OpenID.

Para saber como integrar seu BD ao OAuth e configurar funções para limitar o acesso dos usuários ao seu aplicativo, consulte Implantar um aplicativo seguro ASP.NET MVC 5 com Associação, OAuth e Banco de Dados SQL ao Azure.