É uma biblioteca de gerenciamento de usuários da Microsoft para ASP.NET. Ela é chamada de Identidade (Identity) ASP.NET. Ela contém recursos, incluindo hash de senha, validação de senha, armazenamento de usuários e gerenciamento de reivindicações. Ela normalmente inclui alguns recursos básicos de autenticação, como cookies e autenticação multifator. Ela pode até mesmo introduzir sua própria interface de usuário em alguns casos.
Todas as estruturas, incluindo MVC ASP.NET, Web Forms e Web Pages, podem usar o ASP.NET Identity. As informações do usuário são armazenadas em um banco de dados por padrão no ASP.NET Identity. Também é viável armazenar dados em uma variedade de provedores de armazenamento, dependendo das necessidades do aplicativo. SharePoint, serviços de tabela do Azure e outras fontes de dados (exemplos de provedores de dados).
No ASP.NET Identity, a autorização baseada em função também é muito significativa. Agora podemos definir facilmente funções como "Administrador", "Cliente" e assim por diante, o que nos permite atribuir usuários a essas funções e restringir seu acesso a algumas áreas do programa.
O Identificador de ASP.NET é um divisor de águas, pois introduz a Autenticação de Dois Fatores em seu aplicativo Web.
Porém, ela possui um conjunto muito limitado de propriedades, mas é possivel extender. É isso que você irá aprender agora.
public class IdentityUser<TKey> where TKey : IEquatable<TKey>
{
public IdentityUser() { }
public IdentityUser(string userName) : this()
{
UserName = userName;
}
[PersonalData]
public virtual TKey Id { get; set; }
[ProtectedPersonalData]
public virtual string UserName { get; set; }
public virtual string NormalizedUserName { get; set; }
[ProtectedPersonalData]
public virtual string Email { get; set; }
public virtual string NormalizedEmail { get; set; }
[PersonalData]
public virtual bool EmailConfirmed { get; set; }
public virtual string PasswordHash { get; set; }
public virtual string SecurityStamp { get; set; }
public virtual string ConcurrencyStamp { get; set; } = Guid.NewGuid().ToString();
[ProtectedPersonalData]
public virtual string PhoneNumber { get; set; }
[PersonalData]
public virtual bool PhoneNumberConfirmed { get; set; }
[PersonalData]
public virtual bool TwoFactorEnabled { get; set; }
public virtual DateTimeOffset? LockoutEnd { get; set; }
public virtual bool LockoutEnabled { get; set; }
public virtual int AccessFailedCount { get; set; }
public override string ToString()
=> UserName;
}
Estender IdentityUser Class
Você pode nomear a classe que estende a classe IdentityUser como quiser, mas é costume nomeá-la como ApplicationUser. No exemplo abaixo, a classe ApplicationUser estende a classe IdentityUser .
public class ApplicationUser : IdentityUser
{
public string City { get; set; }
}
Para encontre todas as referências da classe IdentityUser e substitui-la por nossa classe personalizada ApplicationUser , clique com o botão direito do mouse na classe IdentityUser e, em seguida, selecionar "Localizar todas as referências" no menu de contexto. Navegue até cada referência na lista e substitua a classe IdentityUser pela classe ApplicationUser.
Especifique a classe ApplicationUser como o argumento genérico para a classe IdentityDbContext. É assim que a classe IdentityDbContext sabe que precisa trabalhar com nossa classe de usuário personalizada (neste caso, a classe ApplicationUser) em vez da classeIdentityUser interna padrão.
public class AppDbContext : IdentityDbContext<ApplicationUser>
{
public AppDbContext(DbContextOptions<AppDbContext> options)
: base(options)
{ }
public DbSet<Employee> Employees { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Seed();
}
}
Gerar uma nova migração para adicionar colunas à tabela AspNetUsers
Add-Migration Extend_IdentityUser, este comando gera o código de migração necessário para adicionar a coluna Cidade à tabela AspNetUsers.
Extend_IdentityUser de classe parcial pública : Migração
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<string>(
nome: "Cidade",
tabela: "AspNetUsers",
anulável: verdadeiro);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
nome: "Cidade",
tabela: "AspNetUsers");
}
}
Em seguida, aplique a migração ao banco de dados usando o seguinte comando: Update-Database
Estendendo IdentityUser - Add-Migration Não está funcionando
Se a classe ApplicationUser (a classe que estende a classe IdentityUser) não for especificada como o argumento genérico para a classe IdentityDbContext, o comando Add-Migration não funcionará. Ele não gera o código de migração necessário para adicionar as colunas adicionais à tabela de identidade AspNetUsers.Para corrigir isso, especifique a classe ApplicationUser como o argumento genérico para a classe IdentityDbContext.
public class AppDbContext : IdentityDbContext<ApplicationUser>
{
public AppDbContext(DbContextOptions<AppDbContext> options)
: base(options)
{ }
public DbSet<Employee> Employees { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Seed();
}
}
Se você obtiver a seguinte exceção, a causa mais provável é em algum lugar com em seu aplicativo você ainda está usando classe IdentityUser em vez da classe ApplicationUser.
No service for type 'Microsoft.AspNetCore.Identity.SignInManager`1[Microsoft.AspNetCore.Identity.IdentityUser]' has been registered.
No Visual Studio, procure a classe IdentityUser em todo o aplicativo usando CTRL + SHIFT + F
Substitua a classe IdentityUser pela classe ApplicationUser e execute novamente o projeto.
Para poder armazenar dados para a coluna Cidade personalizada na tabela AspNetUsers precisamos alterar
· RegisterViewModel classe
· Registrar Visualização
· Registrar ação no AccountController
Classe RegisterViewModel Esta é a classe de modelo para o modo de exibição Register. Modifique-o para incluir a propriedade City.
public class RegisterViewModel{
// Other Properties
public string City { get; set; }
}
Register View
inclua um campo para capturar um valor para a Cidade.
@model RegisterViewModel
@{
ViewBag.Title = "User Registration";
}
<h1>User Registration</h1>
<div class="row">
<div class="col-md-12">
<form method="post">
<div asp-validation-summary="All" class="text-danger"></div>
<div class="form-group">
<label asp-for="Email"></label>
<input asp-for="Email" class="form-control" />
<span asp-validation-for="Email" class="text-danger"></span>
</div>
@*Other Fields*@
<div class="form-group">
<label asp-for="City"></label>
<input asp-for="City" class="form-control" />
</div>
<button type="submit" class="btn btn-primary">Register</button>
</form>
</div>
</div>
AccountController - Ação de registro
· Preencha a propriedade City da instância ApplicationUser que é passada para o método CreateAsync() da classe UserManager.
· Os dados na instância ApplicationUser são salvos na tabela AspNetUsers pela classe IdentityDbContext.
[HttpPost]
[AllowAnonymous]
public async Task<IActionResult> Register(RegisterViewModel model)
{
if (ModelState.IsValid)
{
var user = new ApplicationUser
{
UserName = model.Email,
Email = model.Email,
City = model.City
};
var result = await userManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
await signInManager.SignInAsync(user, isPersistent: false);
return RedirectToAction("index", "home");
}
foreach (var error in result.Errors)
{
ModelState.AddModelError(string.Empty, error.Description);
}
}
return View(model);
}