AuthenticationController - Assignment 3
Mon Jun 17 2024 08:41:47 GMT+0000 (Coordinated Universal Time)
Saved by @iamkatmakhafola
[Route("api/[controller]")] [ApiController] public class AuthenticationController : ControllerBase { private readonly UserManager<AppUser> _userManager; private readonly IUserClaimsPrincipalFactory<AppUser> _claimsFactory; private readonly IRepository _repository; private readonly IConfiguration _configuration; public AuthenticationController(UserManager<AppUser> userManager, IUserClaimsPrincipalFactory<AppUser> claimsPrincipalFactory, IRepository repository, IConfiguration configuration) { _repository = repository; _userManager = userManager; _claimsFactory = claimsPrincipalFactory; _configuration = configuration; } [HttpPost] [Route("Register")] public async Task<IActionResult> Register(UserViewModel userViewModel) { var user = await _userManager.FindByIdAsync(userViewModel.email); if (user == null) { user = new AppUser { Id = Guid.NewGuid().ToString(), UserName = userViewModel.email, Email = userViewModel.email }; var result = await _userManager.CreateAsync(user, userViewModel.password); if (result.Errors.Count() > 0) return StatusCode(StatusCodes.Status500InternalServerError, "Internal Server Error. Please contact support."); } else { return Forbid("Account already exists."); } return Ok(); } [HttpPost] [Route("Login")] public async Task<ActionResult> Login(UserViewModel uvm) { var user = await _userManager.FindByNameAsync(uvm.email); if (user != null && await _userManager.CheckPasswordAsync(user, uvm.password)) { try { var userPrincipal = await _claimsFactory.CreateAsync(user); return GenerateJWTToken(user); } catch (Exception) { return StatusCode(StatusCodes.Status500InternalServerError, "Internal Server Error. Please contact support."); } } else { return NotFound("Does not exist"); } } [HttpGet] private ActionResult GenerateJWTToken(AppUser user) { // Create JWT Token var userClaims = new[] { new Claim(JwtRegisteredClaimNames.Sub, user.Email), new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()), new Claim(JwtRegisteredClaimNames.UniqueName, user.UserName) }; var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Tokens:Key"])); var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); var token = new JwtSecurityToken( _configuration["Tokens:Issuer"], _configuration["Tokens:Audience"], userClaims , signingCredentials: credentials, expires: DateTime.UtcNow.AddHours(3) ); return Created("", new { token = new JwtSecurityTokenHandler().WriteToken(token), user = user.UserName }); } }
Assignment 3 - Register, Login and GenerateJWTToken methods
Comments