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
[Authorize]
public class TodoController : Controller
{
private readonly ITodoItemService _todoItemService;
private readonly UserManager<ApplicationUser> _userManager;
public TodoController(ITodoItemService todoItemService,
UserManager<ApplicationUser> userManager)
{
_todoItemService = todoItemService;
_userManager = userManager;
}
// ...
}Você precisará adicionar um novo comando using no início do arquivo:
using Microsoft.AspNetCore.Identity;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?