hikirangi

Untitled

May 15th, 2020
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.46 KB | None | 0 0
  1. private readonly SignInManager<User> _signInManager;
  2. private readonly UserManager<User> _userManager;
  3. private readonly IConfiguration _configuration;
  4.  
  5. public AccountController(UserManager<User> userManager, SignInManager<User> signInManager,
  6. IConfiguration configuration)
  7. {
  8. _userManager = userManager;
  9. _signInManager = signInManager;
  10. _configuration = configuration;
  11. }
  12.  
  13. [HttpPost]
  14. public async Task<object> Login([FromBody] LoginDto model)
  15. {
  16. if (model.Login.IndexOf('@') > -1)
  17. {
  18. if (!new Regex(@"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}" +
  19. @"\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\" +
  20. @".)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$")
  21. .IsMatch(model.Login))
  22. {
  23. return BadRequest(new {Message = new[] {"Email is not valid"}});
  24. }
  25.  
  26. var user = await _userManager.FindByEmailAsync(model.Login);
  27. if (user == null)
  28. {
  29. return BadRequest(new {Message = new[] {"Invalid UserName or password"}});
  30. }
  31.  
  32. model.Login = user.UserName;
  33. }
  34. else
  35. {
  36. if (!new Regex(@"^[a-zA-Z0-9]*$").IsMatch(model.Login))
  37. {
  38. return BadRequest(new {Message = new[] {"Username is not valid"}});
  39. }
  40. }
  41.  
  42. var result = await _signInManager.PasswordSignInAsync(model.Login, model.Password, false, false);
  43.  
  44. if (result.Succeeded)
  45. {
  46. var user = _userManager.Users.SingleOrDefault(r => r.UserName == model.Login);
  47. return Json(new {Token = await GenerateJwtToken(user)});
  48. }
  49.  
  50. return BadRequest(new {Message = new[] {"Invalid UserName or password"}});
  51. }
  52.  
  53. [HttpPost]
  54. public async Task<IActionResult> Register([FromBody] RegisterDto model)
  55. {
  56. var user = new User
  57. {
  58. UserName = model.UserName,
  59. Email = model.Email
  60. };
  61.  
  62. var result = await _userManager.CreateAsync(user, model.Password);
  63.  
  64. if (result.Succeeded)
  65. {
  66. await _signInManager.SignInAsync(user, false);
  67. return Json(new {Token = await GenerateJwtToken(user)});
  68. }
  69.  
  70. return BadRequest(new
  71. {
  72. Message = result.Errors
  73. .Select(x => x.Description)
  74. .ToList()
  75. });
  76. }
  77.  
  78. private async Task<object> GenerateJwtToken(User user)
  79. {
  80. ClaimsIdentity claimsIdentity = new ClaimsIdentity(
  81. new List<Claim>
  82. {
  83. new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
  84. new Claim(JwtRegisteredClaimNames.Sub, user.Id),
  85. new Claim("name", user.UserName),
  86. },
  87. "Token");
  88.  
  89. claimsIdentity.AddClaims((await _userManager.GetRolesAsync(user))
  90. .Select(role => new Claim("role", role)));
  91.  
  92. var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:Key"]));
  93. var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
  94. var expires = DateTime.Now.AddDays(Convert.ToDouble(_configuration["Jwt:ExpireDays"]));
  95.  
  96. var token = new JwtSecurityToken(
  97. _configuration["Jwt:Issuer"],
  98. _configuration["Jwt:Issuer"],
  99. claimsIdentity.Claims,
  100. expires: expires,
  101. signingCredentials: creds
  102. );
  103.  
  104. return new JwtSecurityTokenHandler().WriteToken(token);
  105. }
  106.  
  107. public class LoginDto
  108. {
  109. [Required] public string Login { get; set; }
  110.  
  111. [Required] public string Password { get; set; }
  112. }
  113.  
  114. public class RegisterDto
  115. {
  116. [Required] public string UserName { get; set; }
  117.  
  118. [Required] [EmailAddress] public string Email { get; set; }
  119.  
  120. [Required]
  121. [StringLength(100, ErrorMessage = "PASSWORD_MIN_LENGTH", MinimumLength = 6)]
  122. public string Password { get; set; }
  123. }
  124. }
Add Comment
Please, Sign In to add comment