Add project files.

This commit is contained in:
2024-03-06 22:56:56 +05:30
parent 7fa8f770f7
commit 36feb20d97
12 changed files with 595 additions and 0 deletions
+217
View File
@@ -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;
}
}
}
+33
View File
@@ -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();
}
}
}