You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
3.7 KiB
112 lines
3.7 KiB
using DealerSelection.Api.CommonUtil;
|
|
using DealerSelection.Api.Infrastructure.Jwt;
|
|
using DealerSelection.Api.Interface;
|
|
using DealerSelection.Api.Models;
|
|
using Microsoft.Extensions.Logging;
|
|
using Microsoft.IdentityModel.Tokens;
|
|
using System.IdentityModel.Tokens.Jwt;
|
|
using System.Security.Claims;
|
|
using System.Text;
|
|
|
|
public class JwtTokenApi : IJwtTokenApi
|
|
{
|
|
private IJwtRepository Repository { get; }
|
|
private readonly ILogger _logger;
|
|
|
|
public JwtTokenApi(IJwtRepository repository, ILogger<JwtTokenApi> logger)
|
|
{
|
|
Repository = repository;
|
|
_logger = logger;
|
|
}
|
|
|
|
public async Task<string> GenerateToken(AuthValidateModel user)
|
|
{
|
|
try
|
|
{
|
|
bool isValidUser = await Authenticate(user);
|
|
if (isValidUser)
|
|
{
|
|
AuthModel auth = new AuthModel
|
|
{
|
|
BuId = user.BuId,
|
|
ClientId = user.ClientId,
|
|
SecretId = user.SecretId,
|
|
Role = "Admin"
|
|
};
|
|
CustomCfg cfg = CustomCfg.GetCustomCfg(auth.BuId);
|
|
|
|
var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(cfg.Key));
|
|
string expireMinutes = cfg.ExpireMinutes;
|
|
int tokenExpireMinutes = string.IsNullOrEmpty(expireMinutes) ? 1439 : int.Parse(expireMinutes);
|
|
var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);
|
|
var claims = new[]
|
|
{
|
|
new Claim(ClaimTypes.NameIdentifier,auth.ClientId),
|
|
new Claim(ClaimTypes.Role,auth.Role),
|
|
};
|
|
var token = new JwtSecurityToken(
|
|
cfg.Issuer,
|
|
cfg.Audience,
|
|
claims,
|
|
expires: DateTime.UtcNow.AddMinutes(tokenExpireMinutes),
|
|
signingCredentials: credentials);
|
|
return new JwtSecurityTokenHandler().WriteToken(token);
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
_logger.LogError("JwtTokenApi Api GenerateToken:- " + ex.Message.ToString());
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
public async Task<bool> Authenticate(AuthValidateModel userLogin)
|
|
{
|
|
try
|
|
{
|
|
CustomCfg cfg = CustomCfg.GetCustomCfg(userLogin.BuId);
|
|
|
|
return cfg.ClientId.ToLower() == userLogin.ClientId.ToLower() &&
|
|
cfg.ClientSecret.ToLower() == userLogin.SecretId.ToLower();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
_logger.LogError("JwtTokenApi Api Authenticate:- " + ex.Message.ToString());
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public async Task<TokenValidProperty> IsTokenExpired(string tokenValue)
|
|
{
|
|
TokenValidProperty tokenValid = new TokenValidProperty();
|
|
try
|
|
{
|
|
var tokenTicks = GetTokenExpirationTime(tokenValue);
|
|
var tokenDate = DateTimeOffset.FromUnixTimeSeconds(tokenTicks).UtcDateTime;
|
|
|
|
var now = DateTime.UtcNow;
|
|
var valid = tokenDate >= now;
|
|
|
|
tokenValid.isValid = valid;
|
|
tokenValid.Ttl = tokenDate.TimeOfDay.TotalSeconds - now.TimeOfDay.TotalSeconds;
|
|
|
|
return tokenValid;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
_logger.LogError("JwtTokenApi Api IsTokenExpired:- " + ex.Message.ToString());
|
|
return tokenValid;
|
|
}
|
|
}
|
|
|
|
private static long GetTokenExpirationTime(string token)
|
|
{
|
|
var handler = new JwtSecurityTokenHandler();
|
|
var jwtSecurityToken = handler.ReadJwtToken(token);
|
|
var tokenExp = jwtSecurityToken.Claims.First(claim => claim.Type.Equals("exp")).Value;
|
|
var ticks = long.Parse(tokenExp);
|
|
return ticks;
|
|
}
|
|
|
|
}
|