[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
});
}
}