Authorization with roles
Roles são uma abordagem comum para lidar com autorização e permissões em uma aplicação web. Por exemplo, é comum criar uma role de Administrador que ofereça aos usuários administradores mais permissões ou poder do que aos usuários normais.
Neste projeto, você adicionará uma página chamada "Gerenciar Usuários" que somente os administradores conseguem visualizar. Se usuários normais tentarem acessá-la, será apresentado um erro.
Adicionando a página "Gerenciar Usuários"
Primeiro, crie um novo controller:
Controllers/ManageUsersController.cs
Definir a propriedade Roles
no atributo [Authorize]
garantirá que o usuário esteja logado e tenha a role Administrador para visualizar a página.
Em seguida, crie uma view model:
Models/ManageUsersViewModel.cs
Por último, crie o diretório Views/ManageUsers
e a view para a action Index
:
Views/ManageUsers/Index.cshtml
Rode a aplicação e tente acessar a rota /ManageUsers
logado com um usuário normal. Você verá a página de acesso negado:
Isso ocorre porque ainda não temos nenhum usuário administrador.
Criando uma conta de administrator para testes
Por razões óbvias de segurança, nenhum usuário consegue registrar uma nova conta de administrador. Na verdade, o papel de administrador nem existe no banco de dados ainda!
Você pode adicionar a role Administrador mais uma conta de administrador de teste ao banco de dados na primeira vez que o aplicativo for iniciado. A adição de dados pela primeira vez ao banco de dados é chamada de inicialização ou seeding do banco de dados.
Crie uma nova class na raiz do projeto chamada SeedData
:
SeedData.cs
O método InitializeAsync()
usa um IServiceProvider
(a coleção de serviços que é configurada no método Startup.ConfigureServices()
) para obter o RoleManager
e o UserManager
do ASP.NET Core Identity.
Adicione mais dois métodos abaixo do método InitializeAsync()
. Primeiro, o método EnsureRolesAsync()
:
Este método verifica se existe uma role Administrador
no banco de dados. Se não, cria uma. Em vez de digitar repetidamente a string "Administrator"
, crie uma pequena classe chamada "Constants" para conter o valor:
Constants.cs
Se você quiser, você pode atualizar o
ManageUsersController
para usar este valor constante também.
Em seguida, escreva o método EnsureTestAdminAsync()
:
SeedData.cs
Se já não houver um usuário com o nome de usuário admin@todo.local
no banco de dados, esse método criará um e atribuirá uma senha temporária. Depois de fazer o login pela primeira vez, você deve alterar a senha da conta para uma senha segura!
Em seguida, você precisa dizer a sua aplicação para executar essa lógica quando for iniciada. Modifique a classe Program.cs
e atualize o método Main()
para chamar o novo método Initialize Database()
que você irá criar:
Program.cs
Em seguida, adicione o novo método abaixo de Main()
:
Adicione um novo comando using
ao início do arquivo:
Esse método obtém a coleção de serviços que SeedData.InitializeAsync()
precisa e, em seguida, executa o método de seed do banco de dados. Se algo der errado, um erro será registrado.
Como
InitializeAsync()
retorna umaTask
, o métodoWait()
deve ser usado para garantir que seja finalizado antes que a aplicação seja inicializada. Você normalmente usariaawait
para isso, mas por razões técnicas você não pode usarawait
na classeProgram
. Esta é uma exceção rara. Você deve usar oawait
em qualquer outro lugar!
Quando você iniciar a aplicação, a conta admin@todo.local
será criada e atribuída à role Administrador. Tente fazer login com essa conta e navegue até http://localhost:5000/ManageUsers
. Você verá uma lista de todos os usuários registrados na aplicação.
Como um desafio extra, tente adicionar mais recursos de administração a esta página. Por exemplo, você pode adicionar um botão que permita ao administrador excluir uma conta de usuário.
Verificando autorização (authorization) em uma view
O atributo [Authorize]
facilita a execução de uma verificação de autorização em um controller ou action method, mas e se você precisar verificar a autorização em uma view? Por exemplo, seria bom exibir um link "Gerenciar usuários" na barra de navegação se o usuário logado for um administrador.
Você pode injetar o UserManager
diretamente em uma view para realizar esses tipos de verificações. Para manter suas views limpas e organizadas, crie uma nova partial view que adicionará um item à barra de navegação no layout:
Views/Shared/_AdminActionsPartial.cshtml
É convencional nomear partial views compartilhadas começando com um sublinhado
_
, mas não é obrigatório.
Esta partial view usa o SignInManager
para determinar se o usuário está logado. Se não estiver, o resto do código da view pode ser ignorado. Se é um usuário logado, o UserManager
é usado para procurar seus detalhes e executar uma verificação de autorização com IsInRoleAsync()
. Se todas as verificações forem bem-sucedidas e o usuário for um administrador, um link Gerenciar usuários será adicionado à barra de navegação.
Para incluir esta partial view no layout principal, edite _Layout.cshtml
e adicione-a na seção navbar:
Views/Shared/_Layout.cshtml
Quando você fizer login com uma conta de administrador, você verá um novo item no canto superior direito:
Last updated
Was this helpful?