Тази история обобщава как да регистрирате/създадете потребител в базата данни с помощта на 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, което показва, че потребителят е регистриран успешно.