From 4d34da521dd05b16b25d1aa2de2567de9d920512 Mon Sep 17 00:00:00 2001 From: HombreLaser Date: Sun, 20 Nov 2022 18:35:47 -0600 Subject: AƱadido signup de usuarios normales MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Controllers/AdministratorSessionsController.cs | 34 --------------------- Controllers/AdministratorsController.cs | 11 ++++--- Controllers/UserAccountSessionsController.cs | 33 +++++++++++++++++++++ Controllers/UserAccountsController.cs | 39 +++++++++++++++++++++++++ Logics/BaseUserAccountLogic.cs | 3 +- Logics/CreateAdministratorLogic.cs | 37 ----------------------- Logics/CreateAdministratorSessionLogic.cs | 31 -------------------- Logics/CreateUserAccountLogic.cs | 39 +++++++++++++++++++++++++ Logics/CreateUserAccountSessionLogic.cs | 31 ++++++++++++++++++++ Migrations/ApplicationDbContextModelSnapshot.cs | 34 --------------------- Models/ApplicationDbContext.cs | 19 ------------ Program.cs | 5 +--- Services/TokenGenerator.cs | 4 +-- 13 files changed, 154 insertions(+), 166 deletions(-) delete mode 100644 Controllers/AdministratorSessionsController.cs create mode 100644 Controllers/UserAccountSessionsController.cs create mode 100644 Controllers/UserAccountsController.cs delete mode 100644 Logics/CreateAdministratorLogic.cs delete mode 100644 Logics/CreateAdministratorSessionLogic.cs create mode 100644 Logics/CreateUserAccountLogic.cs create mode 100644 Logics/CreateUserAccountSessionLogic.cs diff --git a/Controllers/AdministratorSessionsController.cs b/Controllers/AdministratorSessionsController.cs deleted file mode 100644 index 87f3034..0000000 --- a/Controllers/AdministratorSessionsController.cs +++ /dev/null @@ -1,34 +0,0 @@ -using Microsoft.AspNetCore.Identity; -using Microsoft.AspNetCore.Authentication.JwtBearer; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; -using BackendPIA.Forms; -using BackendPIA.Models; -using BackendPIA.Services; -using BackendPIA.Errors; -using BackendPIA.Logics; - -namespace BackendPIA.Controllers { - [Route("api/admin")] - [ApiController] - public class AdministratorSessionsController : ControllerBase { - private readonly ITokenGenerator _token_generator; - private readonly UserManager _manager; - - public AdministratorSessionsController(ITokenGenerator token_generator, UserManager manager) { - _token_generator = token_generator; - _manager = manager; - } - - [HttpPost("login")] - public async Task> Create(UserAccountLoginForm form) { - CreateAdministratorSessionLogic logic = new CreateAdministratorSessionLogic(_token_generator, _manager, form); - var result = await logic.Call(); - - if(result) - return Ok(logic.Token); - - return StatusCode(401, new InvalidLoginError(401, "Check your credentials")); - } - } -} \ No newline at end of file diff --git a/Controllers/AdministratorsController.cs b/Controllers/AdministratorsController.cs index 66f805c..e76581f 100644 --- a/Controllers/AdministratorsController.cs +++ b/Controllers/AdministratorsController.cs @@ -1,10 +1,10 @@ using AutoMapper; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using BackendPIA.Forms; using BackendPIA.Models; using BackendPIA.Services; -using BackendPIA.Errors; using BackendPIA.Logics; namespace BackendPIA.Controllers { @@ -16,16 +16,19 @@ namespace BackendPIA.Controllers { private readonly ITokenGenerator _token_generator; private readonly UserManager _manager; - public AdministratorsController(UserManager manager, IUserAccountService user_account_service, ITokenGenerator token_generator, IMapper mapper) { + public AdministratorsController(UserManager manager, IUserAccountService user_account_service, + ITokenGenerator token_generator, IMapper mapper) + { _user_account_service = user_account_service; _mapper = mapper; - _manager = manager; _token_generator = token_generator; + _manager = manager; } + [Authorize(Roles = "Administrator")] [HttpPost("signup")] public async Task> Create(UserAccountForm form) { - CreateAdministratorLogic logic = new CreateAdministratorLogic(_token_generator, _manager, form, _mapper, _user_account_service); + CreateUserAccountLogic logic = new CreateUserAccountLogic(_token_generator, _manager, form, _mapper, _user_account_service, "Administrator"); var result = await logic.Call(); if(result) diff --git a/Controllers/UserAccountSessionsController.cs b/Controllers/UserAccountSessionsController.cs new file mode 100644 index 0000000..1309c8e --- /dev/null +++ b/Controllers/UserAccountSessionsController.cs @@ -0,0 +1,33 @@ +using AutoMapper; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc; +using BackendPIA.Forms; +using BackendPIA.Models; +using BackendPIA.Services; +using BackendPIA.Errors; +using BackendPIA.Logics; + +namespace BackendPIA.Controllers { + [Route("api/")] + [ApiController] + public class AdministratorSessionsController : ControllerBase { + private readonly ITokenGenerator _token_generator; + private readonly UserManager _manager; + + public AdministratorSessionsController(ITokenGenerator token_generator, UserManager manager) { + _token_generator = token_generator; + _manager = manager; + } + + [HttpPost("login")] + public async Task> Create(UserAccountLoginForm form) { + CreateUserAccountSessionLogic logic = new CreateUserAccountSessionLogic(_token_generator, _manager, form); + var result = await logic.Call(); + + if(result) + return Ok(logic.Token); + + return StatusCode(401, new InvalidLoginError(401, "Check your credentials")); + } + } +} \ No newline at end of file diff --git a/Controllers/UserAccountsController.cs b/Controllers/UserAccountsController.cs new file mode 100644 index 0000000..51c2481 --- /dev/null +++ b/Controllers/UserAccountsController.cs @@ -0,0 +1,39 @@ +using AutoMapper; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc; +using BackendPIA.Forms; +using BackendPIA.Models; +using BackendPIA.Services; +using BackendPIA.Errors; +using BackendPIA.Logics; + +namespace BackendPIA.Controllers { + [Route("api/")] + [ApiController] + public class UserAccountsController : ControllerBase { + private readonly IUserAccountService _user_account_service; + private readonly IMapper _mapper; + private readonly ITokenGenerator _token_generator; + private readonly UserManager _manager; + + public UserAccountsController(UserManager manager, IUserAccountService user_account_service, + ITokenGenerator token_generator, IMapper mapper) + { + _user_account_service = user_account_service; + _mapper = mapper; + _manager = manager; + _token_generator = token_generator; + } + + [HttpPost("signup")] + public async Task> Create(UserAccountForm form) { + CreateUserAccountLogic logic = new CreateUserAccountLogic(_token_generator, _manager, form, _mapper, _user_account_service, "Regular"); + var result = await logic.Call(); + + if(result) + return Ok(logic.Token); + + return StatusCode(422, logic.Errors); + } + } +} \ No newline at end of file diff --git a/Logics/BaseUserAccountLogic.cs b/Logics/BaseUserAccountLogic.cs index 1686bb6..82c28eb 100644 --- a/Logics/BaseUserAccountLogic.cs +++ b/Logics/BaseUserAccountLogic.cs @@ -16,7 +16,8 @@ namespace BackendPIA.Logics { } protected async Task SetAuthenticationToken(UserAccount user) { - _token = new AuthenticationToken { Token = _token_generator.Generate(user, "administrator"), + var roles = await _manager.GetRolesAsync(user); + _token = new AuthenticationToken { Token = _token_generator.Generate(user, roles[0]), RefreshToken = _token_generator.GenerateRefreshToken() }; await SetUserRefreshToken(user); } diff --git a/Logics/CreateAdministratorLogic.cs b/Logics/CreateAdministratorLogic.cs deleted file mode 100644 index 9f8e573..0000000 --- a/Logics/CreateAdministratorLogic.cs +++ /dev/null @@ -1,37 +0,0 @@ -using AutoMapper; -using Microsoft.AspNetCore.Identity; -using BackendPIA.Services; -using BackendPIA.Models; -using BackendPIA.Forms; - -namespace BackendPIA.Logics{ - public class CreateAdministratorLogic : BaseUserAccountLogic { - private readonly UserAccountForm _form; - private readonly IMapper _mapper; - private readonly IUserAccountService _user_account_service; - private IEnumerable _errors; - public IEnumerable Errors { get => _errors; } - - public CreateAdministratorLogic(ITokenGenerator token_generator, UserManager manager, UserAccountForm form, - IMapper mapper, IUserAccountService service) : base(token_generator, manager) - { - _form = form; - _mapper = mapper; - _user_account_service = service; - } - - public async Task Call() { - UserAccount user = _mapper.Map(_form); - var result = await _user_account_service.CreateUserAccount(user, _form.Password, "Administrator"); - - if(result.Succeeded) { - SetAuthenticationToken(user); - - return true; - } - - _errors = result.Errors; - return false; - } - } -} \ No newline at end of file diff --git a/Logics/CreateAdministratorSessionLogic.cs b/Logics/CreateAdministratorSessionLogic.cs deleted file mode 100644 index ce283c7..0000000 --- a/Logics/CreateAdministratorSessionLogic.cs +++ /dev/null @@ -1,31 +0,0 @@ -using Microsoft.AspNetCore.Identity; -using BackendPIA.Services; -using BackendPIA.Models; -using BackendPIA.Forms; - -namespace BackendPIA.Logics { - public class CreateAdministratorSessionLogic : BaseUserAccountLogic { - private readonly UserAccountLoginForm _form; - - public CreateAdministratorSessionLogic(ITokenGenerator token_generator, UserManager manager, UserAccountLoginForm form) : base(token_generator, manager) { - _form = form; - } - - public async Task Call() { - var user = await _manager.FindByEmailAsync(_form.Email); - - if(user == null) - return false; - - var result = await _manager.CheckPasswordAsync(user, _form.Password); - - if(result) { - SetAuthenticationToken(user); - - return true; - } - - return false; - } - } -} \ No newline at end of file diff --git a/Logics/CreateUserAccountLogic.cs b/Logics/CreateUserAccountLogic.cs new file mode 100644 index 0000000..dd37837 --- /dev/null +++ b/Logics/CreateUserAccountLogic.cs @@ -0,0 +1,39 @@ +using AutoMapper; +using Microsoft.AspNetCore.Identity; +using BackendPIA.Services; +using BackendPIA.Models; +using BackendPIA.Forms; + +namespace BackendPIA.Logics{ + public class CreateUserAccountLogic : BaseUserAccountLogic { + private readonly UserAccountForm _form; + private readonly IMapper _mapper; + private readonly IUserAccountService _user_account_service; + private readonly string _role; + private IEnumerable? _errors; + public IEnumerable? Errors { get => _errors; } + + public CreateUserAccountLogic(ITokenGenerator token_generator, UserManager manager, UserAccountForm form, + IMapper mapper, IUserAccountService service, string role) : base(token_generator, manager) + { + _form = form; + _mapper = mapper; + _user_account_service = service; + _role = role; + } + + public async Task Call() { + UserAccount user = _mapper.Map(_form); + var result = await _user_account_service.CreateUserAccount(user, _form.Password, _role); + + if(result.Succeeded) { + await SetAuthenticationToken(user); + + return true; + } + + _errors = result.Errors; + return false; + } + } +} \ No newline at end of file diff --git a/Logics/CreateUserAccountSessionLogic.cs b/Logics/CreateUserAccountSessionLogic.cs new file mode 100644 index 0000000..2e51791 --- /dev/null +++ b/Logics/CreateUserAccountSessionLogic.cs @@ -0,0 +1,31 @@ +using Microsoft.AspNetCore.Identity; +using BackendPIA.Services; +using BackendPIA.Models; +using BackendPIA.Forms; + +namespace BackendPIA.Logics { + public class CreateUserAccountSessionLogic : BaseUserAccountLogic { + private readonly UserAccountLoginForm _form; + + public CreateUserAccountSessionLogic(ITokenGenerator token_generator, UserManager manager, UserAccountLoginForm form) : base(token_generator, manager) { + _form = form; + } + + public async Task Call() { + var user = await _manager.FindByEmailAsync(_form.Email); + + if(user == null ) + return false; + + var result = await _manager.CheckPasswordAsync(user, _form.Password); + + if(result) { + await SetAuthenticationToken(user); + + return true; + } + + return false; + } + } +} \ No newline at end of file diff --git a/Migrations/ApplicationDbContextModelSnapshot.cs b/Migrations/ApplicationDbContextModelSnapshot.cs index 5a233a6..11e74de 100644 --- a/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/Migrations/ApplicationDbContextModelSnapshot.cs @@ -91,24 +91,6 @@ namespace BackendPIA.Migrations .HasDatabaseName("UserNameIndex"); b.ToTable("AspNetUsers", (string)null); - - b.HasData( - new - { - Id = "24edc3d6-bf9c-41a1-9371-224e4419ccb0", - AccessFailedCount = 0, - ConcurrencyStamp = "bd624bcb-3f06-4bce-b924-2666f82e5f23", - Email = "admin@example.com", - EmailConfirmed = false, - LockoutEnabled = false, - NormalizedEmail = "ADMIN@EXAMPLE.COM", - NormalizedUserName = "ADMIN", - PasswordHash = "AQAAAAIAAYagAAAAEL19rXYOEkR3ftL+T5E5vlsLGPu3HSnJuTSLNp/nyffvQvaXlNJFqU1UO3VKB+K6yg==", - PhoneNumberConfirmed = false, - SecurityStamp = "282566ca-8a3b-4310-8e61-8380d16fa07e", - TwoFactorEnabled = false, - UserName = "admin" - }); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => @@ -135,15 +117,6 @@ namespace BackendPIA.Migrations .HasDatabaseName("RoleNameIndex"); b.ToTable("AspNetRoles", (string)null); - - b.HasData( - new - { - Id = "d42006bc-7f69-4aa4-b247-eb9e2abfe0ec", - ConcurrencyStamp = "d42006bc-7f69-4aa4-b247-eb9e2abfe0ec", - Name = "Administrator", - NormalizedName = "ADMINISTRATOR" - }); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => @@ -231,13 +204,6 @@ namespace BackendPIA.Migrations b.HasIndex("RoleId"); b.ToTable("AspNetUserRoles", (string)null); - - b.HasData( - new - { - UserId = "24edc3d6-bf9c-41a1-9371-224e4419ccb0", - RoleId = "d42006bc-7f69-4aa4-b247-eb9e2abfe0ec" - }); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => diff --git a/Models/ApplicationDbContext.cs b/Models/ApplicationDbContext.cs index eda476c..b3b0b15 100644 --- a/Models/ApplicationDbContext.cs +++ b/Models/ApplicationDbContext.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Text; using Microsoft.AspNetCore.Identity.EntityFrameworkCore; -using Microsoft.AspNetCore.Identity; using Microsoft.EntityFrameworkCore; namespace BackendPIA.Models { @@ -11,21 +7,6 @@ namespace BackendPIA.Models { protected override void OnModelCreating(ModelBuilder builder) { base.OnModelCreating(builder); - string user_id = "24edc3d6-bf9c-41a1-9371-224e4419ccb0"; - string role_id = "d42006bc-7f69-4aa4-b247-eb9e2abfe0ec"; - var hasher = new PasswordHasher(); - UserAccount user_seed = new UserAccount { Id = user_id, UserName = "admin", Email = "admin@example.com", - NormalizedEmail = "ADMIN@EXAMPLE.COM", NormalizedUserName = "ADMIN" }; - // TODO: save the seeded admin password in a user secret. - user_seed.PasswordHash = hasher.HashPassword(user_seed, "admin_password"); - builder.Entity().HasData(user_seed); - builder.Entity().HasData(new IdentityRole { - Name = "Administrator", - NormalizedName = "ADMINISTRATOR", - Id = role_id, - ConcurrencyStamp = role_id - }); - builder.Entity>().HasData(new IdentityUserRole { UserId = user_id, RoleId = role_id }); } } } diff --git a/Program.cs b/Program.cs index c3971ab..57feb17 100644 --- a/Program.cs +++ b/Program.cs @@ -23,7 +23,7 @@ builder.Services.AddAutoMapper(typeof(Program)); // Custom services configuration. builder.Services.AddSingleton(s => new TokenGenerator(builder.Configuration["Jwt:Key"])); -builder.Services.AddSingleton(); +builder.Services.AddScoped(); // End of custom services configuration. // Swagger configuration. @@ -68,9 +68,6 @@ builder.Services.AddAuthentication(options => { IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"])), ClockSkew = TimeSpan.Zero } ); -builder.Services.AddAuthorization(options => { - options.AddPolicy("IsAdministrator", policy => policy.RequireClaim("administrator")); -}); // End of authentication configuration. // Identity configuration. diff --git a/Services/TokenGenerator.cs b/Services/TokenGenerator.cs index 70aca4a..514417d 100644 --- a/Services/TokenGenerator.cs +++ b/Services/TokenGenerator.cs @@ -16,13 +16,13 @@ namespace BackendPIA.Services { public string Generate(UserAccount user, string role) { var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_key)); var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); - var expiration = DateTime.UtcNow.AddMinutes(1); + var expiration = DateTime.UtcNow.AddMinutes(5); //var issuer = _configuration["Jwt:Issuer"]; var claims = new List { new Claim("sid", user.Id), new Claim("username", user.UserName), new Claim("email", user.Email), - new Claim("role", role) + new Claim(ClaimTypes.Role, role) }; var descriptor = new JwtSecurityToken(issuer: null, audience: null, claims: claims, expires: expiration, signingCredentials: creds); -- cgit v1.2.3