Add project files.
This commit is contained in:
@@ -0,0 +1,217 @@
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.IdentityModel.Tokens;
|
||||
using System.IdentityModel.Tokens.Jwt;
|
||||
using System.Security.Claims;
|
||||
using System.Security.Cryptography;
|
||||
using APISocietyToolBox.Models;
|
||||
using APISocietyToolBox.Data;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.Data.SqlClient;
|
||||
|
||||
namespace APISocietyToolBox.Controllers
|
||||
{
|
||||
[Route("api/[controller]")]
|
||||
[ApiController]
|
||||
public class JWTAuthController : Controller
|
||||
{
|
||||
public static UserModel user = new UserModel();
|
||||
private readonly IConfiguration _configuration;
|
||||
//private readonly IUserService _userService;
|
||||
private readonly DataContext _Context;
|
||||
|
||||
public JWTAuthController(IConfiguration configuration, DataContext context) //, IUserService userService
|
||||
{
|
||||
_configuration = configuration;
|
||||
//_userService = userService;
|
||||
_Context = context;
|
||||
}
|
||||
|
||||
[HttpGet, Authorize]
|
||||
public ActionResult<string> GetMe()
|
||||
{
|
||||
var userName = ""; // _userService.GetMyName();
|
||||
return Ok(userName);
|
||||
}
|
||||
|
||||
[HttpPost("login")]
|
||||
public async Task<ActionResult<string>> Login(UserDto request)
|
||||
{
|
||||
|
||||
var pUsername = new SqlParameter("@Username", request.Username);
|
||||
var pQueryResponse = await _Context.LoginUserValidate.FromSqlRaw($"sp_ValidateUser @UserName", pUsername).ToListAsync();
|
||||
|
||||
|
||||
if (pQueryResponse[0].UserName != request.Username)
|
||||
{
|
||||
return BadRequest("User not found.");
|
||||
}
|
||||
|
||||
if (!VerifyPasswordHash(request.Password, pQueryResponse[0].LoginPassword, pQueryResponse[0].PasswordSalt))
|
||||
{
|
||||
return BadRequest("Wrong password.");
|
||||
}
|
||||
|
||||
var Token = CreateToken(pQueryResponse[0]);
|
||||
|
||||
var refreshToken = GenerateRefreshToken();
|
||||
user.UserID = pQueryResponse[0].UserID;
|
||||
user.UserName = pQueryResponse[0].UserName;
|
||||
user.UserRole = pQueryResponse[0].UserRole;
|
||||
user.UserRoleID = pQueryResponse[0].UserRoleID;
|
||||
user.PropertyID = pQueryResponse[0].PropertyID;
|
||||
user.RefreshToken = Token;
|
||||
user.TokenExpires = refreshToken.Expires;
|
||||
user.TokenCreated = refreshToken.Created;
|
||||
|
||||
|
||||
|
||||
SetRefreshToken(user);
|
||||
|
||||
return Ok(user);
|
||||
}
|
||||
|
||||
[HttpPost("refresh-token")]
|
||||
public async Task<ActionResult<string>> RefreshToken(UserTokenRefreshModel user)
|
||||
{
|
||||
var pRefreshToken = new SqlParameter("@RefreshToken", user.RefreshToken);
|
||||
var pQuery = _Context.getUserToken.FromSqlRaw($"sp_getUserToken @RefreshToken", pRefreshToken).ToList();
|
||||
//Console.WriteLine(pQuery);
|
||||
var pQueryResponse = await _Context.getUserToken.FromSqlRaw($"sp_getUserToken @RefreshToken", pRefreshToken).ToListAsync();
|
||||
|
||||
if (pQueryResponse[0].Status != 200)
|
||||
{
|
||||
return Unauthorized(pQueryResponse[0]);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
|
||||
string refreshToken = pQueryResponse[0].RefreshToken.ToString();
|
||||
|
||||
if (!user.RefreshToken.Equals(refreshToken))
|
||||
{
|
||||
return Unauthorized("Invalid Refresh Token.");
|
||||
}
|
||||
//else if (user.TokenExpires < DateTime.Now)
|
||||
//{
|
||||
// return Unauthorized("Token expired.");
|
||||
//}
|
||||
LoginResponseModel usrResponse = new LoginResponseModel();
|
||||
UserModel usr = new UserModel();
|
||||
usrResponse.UserName = user.UserName;
|
||||
usrResponse.UserRole = user.UserRole;
|
||||
|
||||
string token = CreateToken(usrResponse);
|
||||
var newRefreshToken = GenerateRefreshToken();
|
||||
|
||||
usr.UserID = pQueryResponse[0].UserID;
|
||||
usr.UserRoleID = pQueryResponse[0].UserRoleID;
|
||||
usr.UserName = user.UserName;
|
||||
usr.UserRole = user.UserRole;
|
||||
usr.PropertyID = pQueryResponse[0].PropertyID;
|
||||
|
||||
usr.RefreshToken = token.ToString();
|
||||
usr.TokenCreated = newRefreshToken.Created;
|
||||
usr.TokenExpires = newRefreshToken.Expires;
|
||||
|
||||
SetRefreshToken(usr);
|
||||
|
||||
pQueryResponse[0].RefreshToken = usr.RefreshToken;
|
||||
pQueryResponse[0].UserRole = user.UserRole;
|
||||
pQueryResponse[0].UserName = user.UserName;
|
||||
pQueryResponse[0].TokenCreated = newRefreshToken.Created;
|
||||
pQueryResponse[0].TokenExpires = newRefreshToken.Expires;
|
||||
//pQueryResponse[0].UserLocation=usr.UserLocation;
|
||||
|
||||
return Ok(pQueryResponse[0]);
|
||||
}
|
||||
}
|
||||
|
||||
private RefreshToken GenerateRefreshToken()
|
||||
{
|
||||
var refreshToken = new RefreshToken
|
||||
{
|
||||
Token = Convert.ToBase64String(RandomNumberGenerator.GetBytes(64)),
|
||||
Expires = DateTime.Now.AddDays(1),
|
||||
Created = DateTime.Now
|
||||
};
|
||||
|
||||
return refreshToken;
|
||||
}
|
||||
|
||||
private void SetRefreshToken(UserModel usr)
|
||||
{
|
||||
try
|
||||
{
|
||||
|
||||
|
||||
//Response.Cookies.Append("refreshToken", newRefreshToken.Token, cookieOptions);
|
||||
UserTokens oUserTokens = new UserTokens();
|
||||
oUserTokens.UserID = usr.UserID;
|
||||
oUserTokens.UserRoleID = usr.UserRoleID;
|
||||
oUserTokens.PropertyID = usr.PropertyID;
|
||||
oUserTokens.RefreshToken = usr.RefreshToken;
|
||||
oUserTokens.TokenCreated = usr.TokenCreated;
|
||||
oUserTokens.TokenExpires = usr.TokenExpires;
|
||||
|
||||
|
||||
_Context.UserTokens.Add(oUserTokens);
|
||||
_Context.SaveChanges();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine(ex.InnerException);
|
||||
}
|
||||
}
|
||||
|
||||
private string CreateToken(LoginResponseModel user)
|
||||
{
|
||||
List<Claim> claims = new List<Claim>
|
||||
{
|
||||
new Claim(ClaimTypes.Name, user.UserName),
|
||||
new Claim(ClaimTypes.Role, user.UserRole)
|
||||
};
|
||||
|
||||
var key = new SymmetricSecurityKey(System.Text.Encoding.UTF8.GetBytes(_configuration.GetSection("AppSettings:Token").Value));
|
||||
|
||||
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha512);
|
||||
|
||||
var token = new JwtSecurityToken(
|
||||
claims: claims,
|
||||
expires: DateTime.Now.AddDays(1),
|
||||
signingCredentials: creds);
|
||||
|
||||
var jwt = new JwtSecurityTokenHandler().WriteToken(token);
|
||||
|
||||
return jwt;
|
||||
}
|
||||
|
||||
|
||||
|
||||
private bool VerifyPasswordHash(string password, string passwordHash, string passwordSalt)
|
||||
{
|
||||
byte[] pbytepasswordSalt = StringToByteArray(passwordSalt);
|
||||
byte[] pbytepasswordHash = StringToByteArray(passwordHash);
|
||||
using (var hmac = new HMACSHA512(pbytepasswordSalt))
|
||||
{
|
||||
var computedHash = hmac.ComputeHash(System.Text.Encoding.UTF8.GetBytes(password));
|
||||
return computedHash.SequenceEqual(pbytepasswordHash);
|
||||
}
|
||||
}
|
||||
public static byte[] StringToByteArray(string hex)
|
||||
{
|
||||
int length = hex.Length / 2;
|
||||
byte[] byteArray = new byte[length];
|
||||
for (int i = 0; i < length; i++)
|
||||
{
|
||||
byteArray[i] = Convert.ToByte(hex.Substring(i * 2, 2), 16);
|
||||
}
|
||||
return byteArray;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
namespace APISocietyToolBox.Controllers
|
||||
{
|
||||
[ApiController]
|
||||
[Route("[controller]")]
|
||||
public class WeatherForecastController : ControllerBase
|
||||
{
|
||||
private static readonly string[] Summaries = new[]
|
||||
{
|
||||
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
|
||||
};
|
||||
|
||||
private readonly ILogger<WeatherForecastController> _logger;
|
||||
|
||||
public WeatherForecastController(ILogger<WeatherForecastController> logger)
|
||||
{
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
[HttpGet(Name = "GetWeatherForecast")]
|
||||
public IEnumerable<WeatherForecast> Get()
|
||||
{
|
||||
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
|
||||
{
|
||||
Date = DateTime.Now.AddDays(index),
|
||||
TemperatureC = Random.Shared.Next(-20, 55),
|
||||
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
|
||||
})
|
||||
.ToArray();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user