Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Quero usar uma custom TABLE

Olá Guilherme,

Eu quero saber se é possível usar uma tabela criada por mim, no meu caso por exemplo quero utilizar uma tabela de usuário que já tem dados em sua base. Caso de para usar, como integrar ela com o Identity ?

3 respostas

Oi Matheus, tudo bem?

Quando você utiliza o Identity, você pode definir os usuários iniciais, num processo chamado de seeding.

Para fazer esse seeding, você pode utilizar sua tabela atual de usuários como fonte de dados para os usuários iniciais no seeding, como neste exemplo do StackOverflow:

https://stackoverflow.com/a/28596759/1123307

  public override void Seed(ApplicationDbContext context)
  {
      //The UserStore is ASP Identity's data layer. Wrap context with the UserStore.
      UserStore<ApplicationUser> userStore = new UserStore<ApplicationUser>(context);

      //The UserManager is ASP Identity's implementation layer: contains the methods.
      //The constructor takes the UserStore: how the methods will interact with the database.
      UserManager<ApplicationUser> userManager = new UserManager<ApplicationUser>(userStore);

      //Add or Update the initial Users into the database as normal.
      context.AddOrUpdate(
          x => x.Email,  //Using Email as the Unique Key: If a record exists with the same email, AddOrUpdate skips it.
          new ApplicationUser() { Email = "damo2@email.co.uk", UserName = "damo2@email.co.uk", PasswordHash = new PasswordHasher().HashPassword("Som3Pass!") },
          new ApplicationUser() { Email = "2ndUser@email.co.uk", UserName = "Jane Doe", PasswordHash = new PasswordHasher().HashPassword("MyPassword") }
      );

      //Save changes so the Id columns will auto-populate.
      context.SaveChanges();

      //ASP Identity User Id's are Guids stored as nvarchar(128), and exposed as strings.

      //Get the UserId only if the SecurityStamp is not set yet.
      string userId = context.Users.Where(x => x.Email == "damo2@email.co.uk" && string.IsNullOrEmpty(x.SecurityStamp)).Select(x => x.Id).FirstOrDefault();

      //If the userId is not null, then the SecurityStamp needs updating.
      if (!string.IsNullOrEmpty(userId)) userManager.UpdateSecurityStamp(userId);

      //Repeat for next user: good opportunity to make a helper method.
      userId = context.Users.Where(x => x.Email == "2ndUser@email.co.uk" && string.IsNullOrEmpty(x.SecurityStamp)).Select(x => x.Id).FirstOrDetault();

      if (!string.IsNullOrempty(userId)) userManager.UpdateSecurityStamp(userId);

      //Continue on with Seed.
  }

Note que o exemplo acima cria apenas 2 usuários:

  • damo2@email.co.uk
  • 2ndUser@email.co.uk

Para adicionar através da sua tabela atual, você terá que modificar o código para ler a sua tabela antes de inserir os usuários do Identity.

Opa, mas nesse caso eu alimento a tabela do AspNetUser, certo ?

Mas se eu quiser usar minha tabela atual ?

solução

Opa, mas nesse caso eu alimento a tabela do AspNetUser, certo ?

Isso mesmo

Mas se eu quiser usar minha tabela atual ?

Não recomendo, porque acho que não vale a pena o esforço de modificar o modelo das tabelas do Identity, criar migrations, aplicar no banco de dados, e principalmente, testar tudo. E principalmente, futuras atualizações no Identity poderão entrar em conflito com suas alterações.

E também não é uma boa prática, pois o Identity já tem seu próprio modelo bem definido. Se for o caso, você pode criar um serviço que sincroniza a tabela AspNetUser com a sua tabela de usuários.