В этой статье кратко описано, как зарегистрировать/создать пользователя в базе данных с помощью EntityFrameworkCore в Asp.Net Core 6.
Репозиторий Github: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, добавляя поле Name.
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
Создать/зарегистрировать пользователя
Создайте папку с именем Службы. Добавьте в Services еще одну папку с именем 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 и использовать внедрение зависимостей.
builder.Services.AddScoped<IUserRepository, UserRepository>();
Добавьте новую папку в Services с именем 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; } }
В папке Controllers добавьте новый контроллер 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, что указывает на то, что пользователь успешно зарегистрирован.