ASP .NET MVC 5 - Trabalhando com Roles : Criando roles e atribuindo aos usuários


  Neste artigo eu vou mostrar como podemos trabalhar com Roles no ASP .NET MVC 5 usando os recursos do ASP .NET Identity.
 

Chegou o curso Curso ASP .NET .MVC 5 Vídeo Aulas onde você vai aprender a criar aplicações web dinâmicas usando a ASP .NET MVC 5.

Um dos maiores desafios em qualquer aplicação web está na implementando da segurança.

No desenvolvimento web tradicional com ASP.NET Web Forms(da versão 2.0 em diante), tínhamos os recursos do MemberShip e Role Providers que permitiam definir funções, usuários e atribuir funções aos usuários nos ajudando a gerenciar a autorização.

Mas o advento das redes sociais e dos provedores de autenticação globais, precisávamos de um sistema de afiliação atualizado. A ASP.NET Identity é o novo sistema de associação para a construção de aplicações web, para smartphones, aplicações híbridas, etc., usando as identidades sociais para autenticação e autorização.

Assim, podemos agora usar o Windows Live (Hotmail, por exemplo), Gmail, Facebook e Twitter para autenticação antes que o usuário comece a usar nossa aplicação web.

Quando você cria uma aplicação usando o framework ASP .NET MVC ele já cria por padrão praticamente todos os recursos para autenticação e autorização. Alguns já estão prontos para usar como o registro e autenticação de usuário mas a criação de perfis, por exemplo, é uma funcionalidade que você mesmo terá que criar, pelo menos até o momento.

Neste artigo eu mostro como usar a infraestrutura criada pelo ASP .NET Identity para implementar roles ou perfis de usuário de uma maneira a mais simples possível.

Recursos usados :

Criando o projeto no VS 2015 Community

Abra o VS Community 2015 e clique em New Project;

A seguir selecione Visual C# -> ASP .NET Web Application;

Informe o nome Mvc_Roles e clique no botão OK;

A seguir selecione o template MVC, marque MVC e selecione a autenticação Individual User Accounts e clique no botão OK;

Será criado um projeto contendo toda a estrutura de pastas criadas pelo framework ASP .NET MVC com autenticação e segurança padrão definidas.

Podemos ver as referências aos recursos da ASP .NET Identity na janela Solution Explorer:

Ajustando o projeto para criar Roles

Vamos iniciar agora os ajustes necessários para poder criar Roles em nossa aplicação ASP .NET MVC. Para facilitar o acompanhamento vou criar um roteiro bem resumido:

Etapa 1 - Incluindo a propriedade Name na classe RegisterViewModel

Na pasta Models do projeto temos o arquivo IdentityModel.cs que contém a classe ApplicationDbContext que é usada para realizar a conexão com o banco de dados onde as tabelas Users e Roles serão criadas.

Nesta pasta temos também o arquivo AccountViewModel.cs que contém classes para Login e Registro.

Abra este arquivo e localize a classe RegisterViewModel e inclua a seguinte propriedade string :  public string Name {get; set; }

Esta propriedade será usada para atribuir o perfil para usuário quando um novo usuário for registrado na aplicação.

Etapa 2 - Criando o controlador RoleController na pasta Controllers

Para criar um novo controlador na pasta Controllers clique com o botão direito sobre a pasta e a seguir clique em Add Controller;

Selecione o Scaffold  MVC5 Controller Empty e a seguir informe o nome RoleController:

A seguir inclua o código abaixo na classe RoleController:

using System.Linq;
using System.Web.Mvc;
using Mvc_Roles.Models;
using Microsoft.AspNet.Identity.EntityFramework;
namespace Mvc_Roles.Controllers
{
    public class RoleController : Controller
    {
        ApplicationDbContext context;
        public RoleController()
        {
            context = new ApplicationDbContext();
        }
        public ActionResult Index()
        {
            var Roles = context.Roles.ToList();
            return View(Roles);
        }
        public ActionResult Create()
        {
            var Role = new IdentityRole();
            return View(Role);
        }
        [HttpPost]
        public ActionResult Create(IdentityRole Role)
        {
            context.Roles.Add(Role);
            context.SaveChanges();
            return RedirectToAction("Index");
        }
    }
}

Observe que no construtor da classe estamos criando uma instância do contexto.

Neste controlador temos os seguintes métodos Action:

Para criar um Perfil (Role) usamos a classe IdentityRole que fornece propriedades como id, Name, etc., para a criação de perfis para a aplicação.

Por este motivo incluímos o namespace using Microsoft.AspNet.Identity.EntityFramework; no projeto.

Etapa 3 - Criando as Views Index e Create

a - Criando a View Index

Clique com o botão direito sobre o método Action Index do controlador RoleController;

Clique em Add View e a seguir defina o template Empty(without model), conforme figura abaixo , e clique no botão Add;

A seguir inclua o código abaixo no arquivo Index.cshtml que foi criado na pasta Views/Role:

@model IEnumerable<Microsoft.AspNet.Identity.EntityFramework.IdentityRole>
@{
    ViewBag.Title = "Index";
}
<h2>Perfis Disponíveis</h2>
<p>
    @Html.ActionLink("Criar Novo Perfil", "Create")
</p>
<table class="table">
    <tr>
        <th>
            @Html.Label("Nome do Perfil")
        </th>
        <th></th>
    </tr>
@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Name)
        </td>
    </tr>
}
</table>

Note que estamos usando a classe IdentityRole como nosso modelo na diretiva @model.

b - Criando a View Create

Repita o procedimento acima desta vez clicando com o botão direito do mouse sobre o método Action Create do controlador RoleController;

Inclua o código abaixo na view Create.cshtml que será criada na pasta Views/Role:

@model Microsoft.AspNet.Identity.EntityFramework.IdentityRole
@{
    ViewBag.Title = "Create";
}
<h2>Criar Perfil</h2>
@using (Html.BeginForm()) 
{
    @Html.AntiForgeryToken()
    <div class="form-horizontal">
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        <div class="form-group">
            @Html.Label("Informe o nome do Perfil", htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" })
            </div>
        </div>
        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Criar Perfil" class="btn btn-default" />
            </div>
        </div>
    </div>
}
<div>
    @Html.ActionLink("Retornar", "Index")
</div>

Note que estamos usando a classe IdentityRole como nosso modelo na diretiva @model.

Etapa 4 - Criando uma instância de ApplicatoinDbContext no construtor da classe AccountController

Abra a classe AccountController.cs na pasta Controllers e crie uma instância da classe ApplicationDbContext no construtor :

Etapa 5 - Alterando o método Register (Get e Post) da classe AccountController

Vamos agora fazer duas alterações no método Register da classe AccountController da pasta Controllers.

1- Incluir a seguinte linha de código no método Register (Get)

ViewBag.Name = new SelectList(context.Roles.ToList(), "Name", "Name");

Este código fornece a informação das Roles para a view Register, de forma que quando um novo usuário for registrado podemos selecionar um perfil e atribuir ao mesmo.

2- Incluir o trecho de código abaixo no método Register (Post)

//Atribui o Peril ao usuário
await this.UserManager.AddToRoleAsync(user.Id, model.Name);
//termina aqui

Este código atribui o perfil ao usuário.

Abaixo vemos como devem ficar as alterações no método Register:

Etapa 6 - Alterando a view Register para exibir os perfis existentes

Agora abra o arquivo Register.cshtml na pasta Views/Account;

Vamos incluir o trecho de código abaixo logo acima do botão Submit do formulário para criar um caixa de listagem para exibir os perfis (roles) disponíveis:

  ...
 
<!--Selecione o Tipo de Perfil para o usuário-->
 
<div class="form-group">
    @Html.Label(
"Selecione o Tipo de Perfil do Usuário", new { @class = "col-md-2 control-label" })
     <
div class="col-md-10">
        @Html.DropDownList(
"Name")
     </
div>
  </
div>
 
<!--termina aqui-->


  <div class="form-group">
    <
div class="col-md-offset-2 col-md-10">
      <
input type="submit" class="btn btn-default" value="Register" />
    </
div>
  </
div>
}

Etapa 7 - Incluindo o link para criar Roles no arquivo _Layout

Finalmente vamos incluir no arquivo de leiaute da aplicação, _Layout.cshtml, que esta na pasta Views/Shared o link para acessar a funcionalidade implementada:

Agora, é só alegria...

Execute a aplicação pressionando F5;

Deveremos obter a view Index.cshtml sendo renderizada conforme a figura abaixo;

Clicando no link Criar Perfil iremos obter a view Index.cshtml do controlador Role exibindo os perfis (roles) existentes:

Para criar um novo perfil (role) basta clicar no link - Criar Novo Perfil.

A seguir basta informe o nome do perfil e clicar no botão Criar Perfil:

Pronto ! Já temos a funcionalidade implementada para exibir e criar um perfis que poderão ser atribuídos ao usuário.

Para fazer isso basta clicar no menu Registrar e ao registrar um novo usuário selecionar o perfil e atribuir ao usuário:

E assim concluímos a implementação da criação de roles e sua atribuição aos usuários.

Dando graças ao Pai que nos fez idôneos para participar da herança dos santos na luz;
O qual nos tirou da potestade das trevas, e nos transportou para o reino do Filho do seu amor;
Colossenses 1:12,13

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 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

 

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti