| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- 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<AccountController> _logger;
- private readonly SignInManager<StoreUser> _signInManager;
- private readonly UserManager<StoreUser> _userManager;
- private readonly IConfiguration _config;
- public AccountController(ILogger<AccountController> logger,
- SignInManager<StoreUser> signInManager,
- UserManager<StoreUser> 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<IActionResult> 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<IActionResult> Logout()
- {
- await _signInManager.SignOutAsync();
- return RedirectToAction("Index", "App");
- }
- [HttpPost]
- public async Task<IActionResult> 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();
- }
- }
- }
|