ASP .NET Core Blazor - Gerenciando Usuários e Perfis - II

 Neste artigo veremos como gerenciar users e roles em uma aplicação ASP .NET Core Blazor usando o .NET Core 3.0.

Continuando o artigo anterior vamos agora implementar as funcionalidades que vão permitir adicionar, editar e deletar usuários.

Recursos usados:

Implementando a inclusão e edição de usuários

Abra o projeto BlazorAutenticacao criado no artigo anterior, e, no arquivo Administrador.razor, logo após o código que exibe a lista de usuários,  inclua o código abaixo que vai permitir exibir os botões para Adicionar, Salvar e Deletar usuários onde definimos os eventos @onclick para invocar os respectivos métodos :

...  

@if (MostraPopup)
{
    <!-- Este popup permite criar ou editar um usuário -->
    <div class="modal" tabindex="-1" style="display:block" role="dialog">
        <div class="modal-dialog">
            <div class="modal-content">
                <div class="modal-header">
                    <h3 class="modal-title">Cria/Edita Usuário</h3>
                  
 <button type="button" class="close" @onclick="FechaPopup">
                        <span aria-hidden="true">X</span>
                    </button>

                </div>
                <!-- Edita o formulário para o usuário atual -->
                <div class="modal-body">
                    <!-- Somente mostra o ID se não for um novo usuário -->
                    @if (objUser.Id != "")
                    {
                        <p>@objUser.Id</p>
                    }

                    <!-- somete permite editar se for um novo usuario -->
                    @if (objUser.Id != "")
                    {
                        <p>@objUser.UserName</p>
                    }
                    else
                    {
                        <input class="form-control" type="text" placeholder="Nome"  @bind="objUser.UserName" />
                    }

                    <input class="form-control" type="text" placeholder="Email" @bind="objUser.Email" />
                    <input class="form-control" type="password" placeholder="Password" @bind="objUser.PasswordHash" />
                    <select class="form-control" @bind="@CurrentUserRole">
                        @foreach (var option in Options)
                        {
                            <option value="@option">
                                @option
                            </option>
                        }
                    </select>

                    <br /><br />
                    <!-- Botão para salvar o usuário -->
                  
 <button class="btn btn-primary"  @onclick="SalvaUser">
                        Salvar
                    </button>

                    <!-- Mostra o botão deletar se não for um novo registro -->
                    @if (objUser.Id != "")
                    {
                        <!-- Button para deletar -->
                      
 <button class="btn btn-danger"  @onclick="DeletaUser">
                                Deletar
                        </button>

                    }
                    <br />
                    <span style="color:red">@strError</span>
                </div>
            </div>
        </div>
    </div>
}
<button class="btn btn-success" @onclick="AdicionaNovoUser">Adicionar Usuário</button>
...
 

Neste código usamos o databinding do Blazor para vincular os dados do objeto que representa o usuário ao formulário permitindo a edição dos dados.

A seguir no método AdicionarNovoUser() inclua o código a seguir:

    void AdicionaNovoUser()
    {
        // cria um novo usuário
        objUser = new IdentityUser();
        objUser.PasswordHash = "*****";
        // Definie o id como vazio
        objUser.Id = "";
        // abre o popup
        MostraPopup = true;
    }

Aqui estamos criando um novo usuário e atribuindo um Id vazio, uma senha padrão e a seguir abrindo a janela MostraPopup().

Agora no método SalvaUser() inclua o código abaixo :

               // obtem o usuário
                var user = await _UserManager.FindByIdAsync(objUser.Id);
                // atualiza Email
                user.Email = objUser.Email;
                // atualiza o usuário
                await _UserManager.UpdateAsync(user);
                // somente atualiza a senha se o o valor atual
                // não for o valor padrão

                if (objUser.PasswordHash != "*****")
                {
                    var resetToken =  await _UserManager.GeneratePasswordResetTokenAsync(user);
                    var passworduser = await _UserManager.ResetPasswordAsync( user, resetToken, objUser.PasswordHash);
                    if (!passworduser.Succeeded)
                    {
                        if (passworduser.Errors.FirstOrDefault() != null)
                        {
                            strError = passworduser.Errors.FirstOrDefault().Description;
                        }
                        else
                        {
                            strError = "Erro na senha...";
                        }
                        // mantem o popup aberto
                        return;
                    }
                }

                // trata os perfis
                // O usuário esta no perfil admin ?

                var UserResult = await _UserManager.IsInRoleAsync(user, ADMINISTRATION_ROLE);
                // O perfil Administrator foi selecionado
                // mas o usuário não é um Administrator?

                if ((CurrentUserRole == ADMINISTRATION_ROLE) & (!UserResult))
                {
                    // poe o admin no perfil Administrator
                    await _UserManager.AddToRoleAsync(user, ADMINISTRATION_ROLE);
                }
                else
                {
                    // O perfil administrador não foi selecioniado
                   //  mas o usuário é um Administrator?

                    if ((CurrentUserRole != ADMINISTRATION_ROLE) & (UserResult))
                    {
                        // Remove o usuário do perfil Administrator
                        await _UserManager.RemoveFromRoleAsync(user, ADMINISTRATION_ROLE);
                    }
                }
            }
            else
            {
                // Inclui um novo usuario
                var NewUser = new IdentityUser
                {
                        UserName = objUser.UserName,
                        Email = objUser.Email
                };

                var CreateResult = await _UserManager.CreateAsync(NewUser, objUser.PasswordHash);

                if (!CreateResult.Succeeded)
                {
                    if (CreateResult.Errors.FirstOrDefault() != null)
                    {
                        strError = CreateResult.Errors.FirstOrDefault().Description;
                    }
                    else
                    {
                        strError = "Erro ao criar usuário...";
                    }
                    return;
                }
                else
                {
                    if (CurrentUserRole == ADMINISTRATION_ROLE)
                    {

                        // Põe o admin no perfil Administrator
                        await _UserManager.AddToRoleAsync(NewUser, ADMINISTRATION_ROLE);
                    }
                }
            }

            MostraPopup = false;
            // atualiza
            GetUsers();
        }
        catch (Exception ex)
        {
            strError = ex.GetBaseException().Message;
        }
    }

Neste método conforme a informação recebido do usuário iremos incluir ou editar os dados. Se houver um usuário selecionado com um ID válido faremos a edição dos dados. Caso não haja um usuário selecionado e o Id for vazio então vamos incluir um novo usuário.

A seguir vamos definir o código do método EditaUser() que vai permitir editar os dados de um usuário selecionado:

   async Task EditaUser(IdentityUser _IdentityUser)
    {
        // Define o usuario selecionado como o atual
        objUser = _IdentityUser;
        // Obtem o usuario
        var user = await _UserManager.FindByIdAsync(objUser.Id);
        if (user != null)
        {
            // O usuario esta no perfiel administrator ?
            var UserResult = await _UserManager.IsInRoleAsync(user, ADMINISTRATION_ROLE);
            if (UserResult)
            {
                CurrentUserRole = ADMINISTRATION_ROLE;
            }
            else
            {
                CurrentUserRole = "Users";
            }
        }
        // Abre o popup
        MostraPopup = true;
    }

E para concluir vamos incluir o código abaixo no método DeletaUser() que exclui um usuário selecionado :

   async Task DeletaUser()
    {
        // Fecha o Popup
        MostraPopup = false;
        // Obtem o usuário
        var user = await _UserManager.FindByIdAsync(objUser.Id);
        if (user != null)
        {
            // Deleta o usuario
            await _UserManager.DeleteAsync(user);
        }
        // atualiza
        GetUsers();
    }

Agora é só alegria...

Podemos testar executando o projeto e fazendo o login usando um usuário já registrado e a seguir acionando a opção Administração, o que nos dará o seguinte resultado:

Agora podemos incluir, editar e excluir usuário e temos assim todas as funcionalidades para gerenciar usuários implementadas.

Pegue o código do projeto aqui: BlazorAutenticacao.zip (sem as referências)
 

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 ?


Referências:


José Carlos Macoratti