using DutchTreat.Data.Entities; using DutchTreat.ViewModels; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; using Microsoft.IdentityModel.Tokens; using System; using System.Collections.Generic; using System.IdentityModel.Tokens.Jwt; using System.Linq; using System.Security.Claims; using System.Text; using System.Threading.Tasks; namespace DutchTreat.Controllers { public class AccountController : Controller { private readonly ILogger _logger; private readonly SignInManager _signInManager; private readonly UserManager _userManager; private readonly IConfiguration _config; public AccountController(ILogger logger, SignInManager signInManager, UserManager userManager, IConfiguration config) { _logger = logger; _signInManager = signInManager; _userManager = userManager; _config = config; } public IActionResult Login() { if (this.User.Identity.IsAuthenticated) { return RedirectToAction("Index", "App"); } return View(); } [HttpPost] public async Task Login(LoginViewModel model) { if (ModelState.IsValid) { var result = await _signInManager.PasswordSignInAsync( model.Username, model.Password, model.RemenberMe, false); if (result.Succeeded) { if (Request.Query.Keys.Contains("ReturnUrl")) { return Redirect(Request.Query["ReturnUrl"].First()); } else { return RedirectToAction("Shop", "App"); } } } ModelState.AddModelError("", "Failed to login"); return View(); } [HttpGet] public async Task Logout() { await _signInManager.SignOutAsync(); return RedirectToAction("Index", "App"); } [HttpPost] public async Task CreateTokenAsync([FromBody] LoginViewModel model) { if (ModelState.IsValid) { var user = await _userManager.FindByNameAsync(model.Username); if (user != null) { var result = await _signInManager.CheckPasswordSignInAsync(user, model.Password, false); if (result.Succeeded) { var claims = 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(_config["Token:Key"])); var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); var token = new JwtSecurityToken( _config["Token:Issuer"], _config["Token:Audience"], claims, signingCredentials: creds, expires: DateTime.UtcNow.AddMinutes(20)); return Created("", new { token = new JwtSecurityTokenHandler().WriteToken(token), expiration = token.ValidTo }); } } } return BadRequest(); } } }