Using identity in the application
Os itens da lista de tarefas a fazer ainda são compartilhados entre todos os usuários, porque as entidades de tarefas armazenadas não estão vinculadas a um usuário específico. Agora que o atributo [Authorize]
garante que você deve estar logado para ver a view de tarefas, você pode filtrar a consulta do banco de dados com base em quem está logado.
Primeiro, injete a UserManager<ApplicationUser>
no TodoController
:
Controllers/TodoController.cs
Você precisará adicionar um novo comando using
no início do arquivo:
A classe UserManager
é parte do ASP.NET Core Identity. Você pode utilizá-la para recuperar o usuário logado na action Index
:
O novo código no topo do action método usa o UserManager
para procurar o usuário logado a partir da propriedade User
disponível na action:
Se houver um usuário logado, a propriedade User
contém um objeto com algumas (mas não todas) informações do usuário. O UserManager
usa isto para procurar os detalhes completos do usuário no banco de dados através do método GetUserAsync()
.
O valor de currentUser
nunca deve ser nulo, porque o atributo [Authorize]
está presente no controller. No entanto, é uma boa idéia fazer uma verificação a mais para garantir. Você pode usar o método Challenge()
para forçar o usuário a efetuar login novamente se suas informações estiverem faltando.
Já que você está passando um parâmetro ApplicationUser
paraGetIncompleteItemsAsync()
, você precisará atualizar a interface ITodoItemService
:
Services/ITodoItemService.cs
Como você mudou a interface ITodoItemService
, você também precisa atualizar a assinatura do método GetIncompleteItemsAsync()
no TodoItemService
:
Services/TodoItemService
O próximo passo é atualizar a consulta do banco de dados e adicionar um filtro para mostrar apenas os itens criados pelo usuário atual. Antes de fazer isso, você precisa adicionar uma nova propriedade ao banco de dados.
Atualizando o banco de dados
Você precisará adicionar uma nova propriedade ao entity model TodoItem
para que cada tarefa possa "lembrar" o usuário que o possui:
Models/TodoItem.cs
Como você atualizou o entity model usado pelo context do banco de dados, também é necessário executar o migrate do banco de dados. Crie uma nova migration usando o comando dotnet ef
no terminal:
Isso cria uma nova migration chamada AddItemUserId
que adicionará uma nova coluna à tabela Items
, espelhando a alteração que você fez no model TodoItem
.
Use o comando dotnet ef
novamente para aplicá-lo ao banco de dados:
Atualizando a service class
Com o banco de dados e seu contexto atualizados, você pode atualizar o método GetIncompleteItemsAsync()
no TodoItemService
e adicionar outra cláusula à instrução Where
:
Services/TodoItemService.cs
Se você executar a aplicatção e se registrar ou efetuar login, verá uma lista de tarefas vazia novamente. Infelizmente, todos os itens que você tenta adicionar desaparecem porque você ainda não atualizou a action AddItem
para tratar os usuários das tarefas ainda.
Atualizando as actions AddItem e MarkDone
Você precisará usar o UserManager
para obter o usuário atual nas actions AddItem
e MarkDone
, assim como você fez em Index
.
Aqui estão os dois métodos atualizados:
Controllers/TodoController.cs
Ambos service methods agora devem aceitar um parâmetro ApplicationUser
. Atualize a definição da interface em ITodoItemService
:
E por último, atualize as implementações do service method no TodoItemService
. No método AddItemAsync
, defina a propriedade UserId
ao construir um new TodoItem
:
A cláusula Where
no método MarkDoneAsync
também precisa verificar o ID do usuário, de forma que um usuário não autorizado não possa completar as tarefas de outra pessoa adivinhando seus IDs:
Pronto! Tente usar a aplicação com duas contas de usuário diferentes. As tarefas agora estão privadas para cada conta de usuário.
Last updated
Was this helpful?