Тази история обобщава как да регистрирате/създадете потребител в базата данни с помощта на EntityFrameworkCore в Asp.Net Core 6.
Github Repository :JWT-Authentication-Template

Създаване на нов проект
Отворете Visual Studio и изберете Създаване на нов проект.

От шаблоните изберете ASP.NET Core Web Api.

Оставете конфигурациите по подразбиране и щракнете върху създаване.

Инсталационни пакети
Microsoft.AspNetCore.Identity.EntityFrameworkCore v6.0.16
Microsoft.EntityFrameworkCore.SqlServer v6.0.16
Microsoft.EntityFrameworkCore.Tools v6.0.16

Установете връзка с SQL Server
Създайте папка, наречена Models на основно ниво.
В папката Models създайте ApplicationDbContext клас, който наследява IdentityDbContext клас.

public class ApplicationDbContext : IdentityDbContext
{
  public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { }
}

Добавете низа за връзка с базата данни в appsettings.json.

"ConnectionStrings": {
    "DefaultConnection": "Server=<Your-Server-Name>;Database=<Your-Database-Name>;Trusted_Connection=True;MultipleActiveResultSets=true"
  }

Актуализирайте Program.cs, за да използвате SQL Server.

builder.Services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));

За да използвате обекти по подразбиране на EntityFramework и да установите връзка с SQL Server, изпълнете:

>Add-Migration "<Migration-Name>"
>Update-Database

Създайте клас ApplicationUser в папката Models, който разширява таблицата AspNetUsers, за да добави поле за име.

public class ApplicationUser : IdentityUser
{
  public string Name { get; set; }
}

Актуализирайте ApplicationDbContext, за да включите разширения клас ApplicationUser.

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
  public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { }
}

Добавете следната препратка в Program.cs, за да обвържете ApplicationUser да използва ApplicationDbContext като хранилище на данни.

builder.Services.AddIdentity<ApplicationUser, IdentityRole>().AddEntityFrameworkStores<ApplicationDbContext>();

Забележка: IdentityRole е полето по подразбиране тук. По-късно можете да подобрите кода, за да включите различни роли, като извикате AddRoles.

Актуализирайте базата данни чрез добавяне на миграция,

>Add-Migration "<Migration-Name>"
>Update-Database

Създаване/Регистриране на потребител
Създайте папка с име Услуги. Добавете друга папка към Услуги, наречена UserRepositories.
Добавете интерфейс в UserRepositories и го наименувайте IUserRepository.

public interface IUserRepository
{
  Task<ApplicationUser> GetByEmail(string email);
  Task<ApplicationUser> GetByUsername(string username);
}

Добавете клас към UserRepositories, който имплементира горния интерфейс, наречете го UserRepository.

public class UserRepository : IUserRepository
{
  private readonly ApplicationDbContext _Context;
  public UserRepository(ApplicationDbContext Context)
  {
    _Context = Context;
  }
  public Task<ApplicationUser> GetByEmail(string email)
  {
   return Task.FromResult(_Context.Users.FirstOrDefault(u => u.Email == email));
  }

  public Task<ApplicationUser> GetByUsername(string username)
  {
    return Task.FromResult(_Context.Users.FirstOrDefault(u => u.UserName == username));
  }
}

Актуализирайте Program.cs, за да разрешите IUserRepository и да използвате Dependency Injection.

builder.Services.AddScoped<IUserRepository, UserRepository>();

Добавете нова папка в Услуги, наречена Handler.
Добавете нов клас, наречен ErrorHandler в Handler папка.

public class ErrorHandler
{
  public IEnumerable<string> ErrorMessages { get; set; }
  public ErrorHandler(string errorMessage) : this(new List<string>() { errorMessage }) { }
  public ErrorHandler(IEnumerable<string> errorMessages)
  {
    ErrorMessages = errorMessages;
  }
}

Създайте нова папка, наречена Dto в папката Models и нов клас, наречен RegisterDto. Това ще съдържа полетата, които са необходими за регистрация на потребител.

public class RegisterDto
{
  public string Name { get; set; }
  public string Email { get; set; }
  public string UserName { get; set; }
  public string Password { get; set; }
}

В папката Контролери Добавете нов контролер на API, наречен AuthenticationController. Към това добавете Post API, който внедрява IUserRepository и позволява регистрация на потребител.

[Route("api/[controller]")]
[ApiController]
public class AuthenticationController : ControllerBase
{
  private readonly IUserRepository _userRepository;
  UserManager<ApplicationUser> _userManager;
  public AuthenticationController(IUserRepository userRepository, UserManager<ApplicationUser> userManager)
  {
    _userRepository = userRepository;
    _userManager = userManager;
  }
  [HttpPost]
  [Route("RegisterUser")]
  public async Task<IActionResult> Register([FromBody] RegisterDto value)
  {
    if (!ModelState.IsValid)
    {
      return BadRequestModelState();
    }

    ApplicationUser existingUserName = await _userRepository.GetByUsername(value.UserName);
    if ((existingUserName != null))
    {
      return Conflict(new ErrorHandler("Username already exists."));
    }

    ApplicationUser existingEmail = await _userRepository.GetByEmail(value.Email);
    if (existingEmail != null)
    {
      return Conflict(new ErrorHandler("Email already exists."));
    }

    var user = new ApplicationUser
    {
      UserName = value.UserName,
      Email = value.Email,
      Name = value.Name
    };
    await _userManager.CreateAsync(user, value.Password);
    return Ok();
  }

  private IActionResult BadRequestModelState()
  {
    IEnumerable<string> errorMessages = ModelState.Values.SelectMany(v => v.Errors.Select(e => e.ErrorMessage));
    return BadRequest(new ErrorHandler(errorMessages));
  }
}

Това е всичко, програмата е готова да регистрира потребителя.

Стартирайте приложението и отворете Postman, за да тествате маршрута на регистъра.
Предайте JSON в тялото на заявката и щракнете върху Изпрати.

Сървърът отговаря със Статус 200 Ok, което показва, че потребителят е регистриран успешно.