ASP .NET Core - Criando e atribuindo Roles - I

 Neste artigo eu vou mostrar como criar e atribuir roles a usuários em uma aplicação ASP .NET Core MVC.

Quando você cria uma aplicação ASP .NET Core MVC usando o template Web Application(Model-View-Controller) com autenticação através da opção Individual User Accounts,  o projeto criado possui toda a estrutura para realizar a autenticação e o registro do usuário.

Você poderá registrar e autenticar usuários na aplicação mas não poderá criar perfis de usuários (as roles) nem atribuir perfis a usuários.

Neste artigo eu vou mostrar uma forma de criar e atribuir perfis a usuários registrados e depois como fazer a autenticação baseada em roles.

Recursos usados:

Criando o projeto no VS 2017

Abra o VS 2017 Community e crie um novo projeto ASP .NET Core usando o template Empty.

  • Create New Project;
  • Visual C# -> Web -> ASP .NET Core Web Application;
  • Informe o nome AspCore_Roles
  • Selecione o template Web Application(Model-View-Controller) , marque ASP .NET Core 2.0,  e clique em Change Authentication, selecionando a seguir a opção: Individual User Accounts:

Confirme as opções clicando em OK para criar o projeto.

Ao final teremos o projeto criado com a seguinte estrutura:

Controllers
 HomeController – Controladores para Home, About, Contact
 AccountController – Controladores para Login, Register, ForgotPassword etc
 ManageController – Controladores para Alterar Senha, gerenciar perfil, para incluir two-factor authentication etc

Data
 Classe ApplicationDBContext com diferentes scripts de migração para criar as tabelas do banco de dados

Extensions
 
Classes para confirmação do email, resetar passwaord, etc.

Models
 
AccountViewModels(LoginViewModel, RegisterViewModel, etc)
 ManageViewModels(ChangePasswordViewModel, EnableAuthenticationViewModel, etc)
 ApplicationUser
 ErrorViewModel

Services
 
Serviço para Enviar Email

Views
 
Views para Account, Manage, Home, About, Contact etc

appsettings.json - arquivo de configuração contendo a string de conexão para o banco de dados

Program.cs - arquivo de entrada da aplicação

Startup.cs - arquivo de inicialização da aplicação

 

O recurso Identity está habilitado para o aplicativo chamando app.UseAuthentication() no método Configure da classe Startup.  Isso adiciona uma autenticação baseada em cookie ao pipeline de solicitação.

Executando a aplicação iremos obter a página incial com os links para Registrar um usuário e fazer a autenticação via login.

Nota: Ao executar a aplicação pela primeira vez será acionado o Migrations Inicial que irá criar o banco de dados e as tabelas para armazenar as informações de usuários, roles, etc.

Antes de executar a aplicação eu vou alterar o nome do banco de dados no arquivo appsettings.json dando um nome mais simples:
 
{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=AspNet_RolesDB;Trusted_Connection=True;MultipleActiveResultSets=true"
  },
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Warning"
    }
  }
}

Nota:  Você pode usar qualquer outro nome da sua escolha.

Agora aplique a migração inicial existente na aplicação, usando o Package Manager Console e digitando o comando:  update-database

Dessa forma teremos o banco de dados e todas as tabelas criadas no SQL Server e prontas para serem usadas em nossa aplicação.

Criando perfis de usuário

Agora veremos como criar perfis de usuários em nossa aplicação. Vou criar três perfis de usuário iniciais : Admin, User e Operator.

Vamos criar um novo método chamado CreateRoles na classe Startup da nossa aplicação usando o código a seguir:
 
        private async Task CreateRoles(IServiceProvider serviceProvider)
        {
            var roleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();
            var userManager = serviceProvider.GetRequiredService<UserManager<ApplicationUser>>();
            string[] rolesNames = { "Admin", "User", "Operator" };
            IdentityResult result;
            foreach(var namesRole in rolesNames)
            {
                var roleExist = await roleManager.RoleExistsAsync(namesRole);
                if(!roleExist)
                {
                    result = await roleManager.CreateAsync(new IdentityRole(namesRole));
                }
            }
        }

Vamos entender o código :

- O método CreateRoles recebe como parâmetro um objeto da interface IServiceProvider;
- Criamos dois serviços :  roleManager e userManager;
Criamos um array de strings contendo os perfis que vamos criar e a seguir atribuir aos usuários : "Admin", "User" e "Operator";
- Verificamos se os perfis já existem usando um laço foreach; Se o perfil não existir criamos o perfil usando o método CreateAsync da instância roleManager;

Após criar o método vamos invocá-lo a partir do método Configure da classe Startup. Para isso inclua o código em azul conforme mostrado abaixo:
 
       public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider serviceProvider)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseBrowserLink();
                app.UseDatabaseErrorPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }
            app.UseStaticFiles();
            app.UseAuthentication();
            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });
            CreateRoles(serviceProvider).Wait();
        }

Agora quando executarmos a aplicação serão criados também os perfis Admin, User e Operador.

Agora executando a aplicação novamente e examinando a tabela AspNetRoles do banco de dados AspNet_RolesDB no SQL Server Management, veremos que foram criados os perfis: Operator, User e Admin:

Assim já estamos prontos para atribuir esses perfis ao registrar um novo usuário e veremos como fazer isso na próxima parte do artigo.

Aguardem...

"E Jesus, tendo ouvido isto, disse-lhes: Os sãos não necessitam de médico, mas, sim, os que estão doentes; eu não vim chamar os justos, mas, sim, os pecadores ao arrependimento. "
Marcos 2:17
 

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti