This commit is contained in:
Adam 2024-09-01 09:25:01 +02:00
commit 64d38174be
15 changed files with 176 additions and 119 deletions

View File

@ -5,7 +5,7 @@ namespace TIAM.Services;
public class SignalRTags : AcSignalRTags
{
public const int GetSiteViewModelByUserId = 999;
public const int GetSiteViewModelByUserId = int.MaxValue;
public const int GetTransfer = 1;
public const int GetTransfers = 2;
@ -132,5 +132,8 @@ public class SignalRTags : AcSignalRTags
public const int DriverUpdateTransfer = 151;
public const int AuthenticateUser = 160;
public const int RefreshToken = 200;
public const int GetAllLogItemsByFilterText = 1000;
}

View File

@ -11,6 +11,7 @@
@using AyCode.Interfaces.StorageHandlers;
@using System.Globalization;
@using AyCode.Core.Enums
@using AyCode.Core.Extensions
@using AyCode.Core.Helpers
@using AyCode.Core.Loggers
@using AyCode.Services.Loggers
@ -104,7 +105,7 @@
else
{
_logger.Info("Couldn't refresh token");
SignOut();
await SignOut();
//NavManager.NavigateTo("/");
return;
}
@ -210,14 +211,19 @@
return (userDetailsStr, locale);
}
private void SignOut()
private async Task SignOut()
{
var userBasicDetail = JsonConvert.DeserializeObject<UserBasicDetails>(userDetailsStr);
_logger.Info("SignOut called");
var userBasicDetail = userDetailsStr.JsonTo<UserBasicDetails>();
await AuthStateProvider.GetAuthenticationStateAsync();
await SecureStorageHandler.ClearAllSecureStorageAsync();
UserDataService.Logout(userBasicDetail?.RefreshToken);
AuthStateProvider.GetAuthenticationStateAsync();
SecureStorageHandler.ClearAllSecureStorageAsync();
sessionService.ClearAll();
ComponentUpdateService.CallRequestRefreshAll();
UserDataService.Logout(userBasicDetail?.RefreshToken).Forget();
}
CultureInfo Culture

View File

@ -94,23 +94,22 @@ namespace TIAMSharedUI.Pages
}
else
{
string authResponseJson = mainResponse.Content.ToJson(); //JsonSerializer.Serialize(mainResponse.Content);
//var authResponseJson = mainResponse.Content.ToJson(); //JsonSerializer.Serialize(mainResponse.Content);
var authResponse = mainResponse.Content.ToJson().JsonTo<AuthenticationTokens>(); //JsonSerializer.Deserialize<AuthenticationResponse>(authResponseJson, new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
var authResponse = authResponseJson.JsonTo<AuthenticationResponse>(); //JsonSerializer.Deserialize<AuthenticationResponse>(authResponseJson, new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
string accessToken = authResponse.AccessToken;
var accessToken = authResponse.AccessToken;
var token = ProcessToken(accessToken);
string userId = token.Claims.First(claim => claim.Type == JwtRegisteredClaimNames.NameId).Value;
string email = token.Claims.First(claim => claim.Type == JwtRegisteredClaimNames.Email).Value;
var userId = token.Claims.First(claim => claim.Type == JwtRegisteredClaimNames.NameId).Value;
var email = token.Claims.First(claim => claim.Type == JwtRegisteredClaimNames.Email).Value;
var myId = Guid.Parse(userId);
//userDataService.User.Email = _email;
var userBasicDetails = new UserBasicDetails(userId, email, authResponse.AccessToken, authResponse.RefreshToken);
string userBasicDetailsJson = JsonSerializer.Serialize(userBasicDetails);
var userBasicDetailsJson = JsonSerializer.Serialize(userBasicDetails);
//save to local storage
@ -193,9 +192,9 @@ namespace TIAMSharedUI.Pages
public async Task<bool> CheckIfDriver(List<UserProductMapping> Permissions)
{
bool _isDriver = false;
var _isDriver = false;
foreach (UserProductMapping Permission in Permissions)
foreach (var Permission in Permissions)
{
//var permissionToCheck = await ServiceProviderDataService.GetUserProductMappingByIdAsync(Permission.Id);
BrowserConsoleLogWriter.Debug($"calling IsPowerOf with values: {Permission.Id}, {Permission.Permissions}, {1}");
@ -213,11 +212,11 @@ namespace TIAMSharedUI.Pages
{
BrowserConsoleLogWriter.Debug($"called IsBitSet with values: {number}, {power}");
int powerOfTwo = 1 << power; // Calculate 2^power
var powerOfTwo = 1 << power; // Calculate 2^power
BrowserConsoleLogWriter.Debug($"powerOfTwo: {powerOfTwo}, {power}");
bool result = (number & powerOfTwo) != 0; // Check if the bit at position `power` is set
var result = (number & powerOfTwo) != 0; // Check if the bit at position `power` is set
return result;
}
}

View File

@ -1,4 +1,4 @@
@page "/user/hoteladmin/{id:guid}"
@page "/user/hoteladmin/{Id:guid}"
@using TIAMSharedUI.Shared
@using TIAMWebApp.Shared.Application.Interfaces;
@using TIAMSharedUI.Shared.Components.BaseComponents
@ -16,7 +16,7 @@
<div class="container-fluid">
<HotelComponent Id="@id"></HotelComponent>
<HotelComponent Id="@Id"></HotelComponent>
<!-- Stats admin-->
<hr />
@ -25,24 +25,19 @@
@code {
[Parameter] public Guid id { get; set; }
bool isUserLoggedIn;
int userType = 0;
[Parameter] public Guid Id { get; set; }
bool _isUserLoggedIn;
int _userType = 0;
protected override void OnInitialized()
{
//check if Id matches with userproductmapping
if (!_sessionService.IsAuthenticated)
{
return;
}
var check = _sessionService.User.UserModelDto.UserProductMappings.Any(x => x.ProductId == id);
if (!check)
{
return;
}
if (!_sessionService.IsAuthenticated) return;
var check = _sessionService.User?.UserModelDto.UserProductMappings.Any(x => x.ProductId == Id) ?? false;
if (!check) return;
base.OnInitialized();
}
}

View File

@ -15,6 +15,7 @@ using TIAMWebApp.Shared.Application.Models;
using TIAMWebApp.Shared.Application.Models.ClientSide.UI;
using TIAMWebApp.Shared.Application.Services;
using TIAMWebApp.Shared.Application.Utility;
using System.Collections.Generic;
namespace TIAMSharedUI.Pages.User.Hotels
{
@ -148,7 +149,9 @@ namespace TIAMSharedUI.Pages.User.Hotels
s.Phone
});
var productOwner = await AdminSignalRClient.GetByIdAsync<List<Company>>(SignalRTags.GetCompaniesById, _hotel.ServiceProviderId);
List<Company>? productOwner = null;
if (_hotel != null) productOwner = await AdminSignalRClient.GetByIdAsync<List<Company>>(SignalRTags.GetCompaniesById, _hotel.ServiceProviderId);
if (productOwner != null)
{
ImageSource = await ServiceProviderDataService.GetQRCodeByProductIdAsync(productOwner[0].AffiliateId);

View File

@ -138,7 +138,7 @@
//-----------------------------------------------------------------------------------
public async Task SubmitForm(object result)
public void SubmitForm(object result)
{
//await WizardProcessor.ProcessWizardAsync(Result.GetType(), Result);
_logger.Info($"Submitted nested form: {result.GetType().FullName}");
@ -162,7 +162,7 @@
_logger = new LoggerClient<MyServiceProviders>(LogWriters.ToArray());
var myId = SessionService.User!.UserId;
_logger.Debug(companies.Count().ToString());
_logger.Debug(companies.Count.ToString());
_contextIds = new Guid[1];
_contextIds[0] = myId;
var result = await AdminSignalRClient.GetByIdAsync<List<Company>>(SignalRTags.GetCompaniesByContextId, myId);

View File

@ -58,7 +58,7 @@ namespace TIAMSharedUI.Shared.Components.BaseComponents
var currentUrl = _navManager.ToBaseRelativePath(_navManager.Uri);
_pageState.AddPageToHistory(currentUrl);
_logger.Debug(_pageState.GetGoBackPage());
//_logger.Debug(_pageState.GetGoBackPage());
}
}
}

View File

@ -112,7 +112,6 @@ namespace TIAMSharedUI.Shared.Components
protected override void OnInitialized()
{
base.OnInitialized();
navigationManager.LocationChanged += OnLocationChanged;
_logger = new LoggerClient<Navbar>(LogWriters.ToArray());
@ -120,7 +119,7 @@ namespace TIAMSharedUI.Shared.Components
_logger.Debug($"Navbar OnInit {DateTime.Now} ");
InitUser();
if (sessionService.IsAuthenticated) InitUser();
}
private void OnLocationChanged(object sender, LocationChangedEventArgs e)
@ -157,6 +156,7 @@ namespace TIAMSharedUI.Shared.Components
myUser = true;
userId = sessionService.User.UserId;
userEmail = sessionService.User.Email;
if (sessionService.User.UserModelDto.ProfileDto.FullName != null)
{
userFullName = sessionService.User.UserModelDto.ProfileDto.FullName!;
@ -169,15 +169,13 @@ namespace TIAMSharedUI.Shared.Components
}
var properties = sessionService.User?.HasProperties;
if (properties == null)
return;
if (properties == null) return;
hasProperty = properties.Count > 0;
isSysAdmin = sessionService.IsSysAdmin;
isDevAdmin = sessionService.IsDevAdmin;
isDriver = sessionService.IsDriver;
foreach (var property in properties)
{
_logger.Detail($"First property: {property.Value} ");

View File

@ -26,6 +26,7 @@ using TIAM.Services.Server.Logins;
using TIAMWebApp.Server.Services;
using AyCode.Core.Enums;
using AyCode.Models.Enums;
using AyCode.Utils.Extensions;
using TIAM.Models;
namespace TIAMWebApp.Server.Controllers
@ -119,7 +120,7 @@ namespace TIAMWebApp.Server.Controllers
var response = new MainResponse
{
Content = new AuthenticationResponse
Content = new AuthenticationTokens
{
RefreshToken = loggedInModel.LoggedInUser.RefreshToken,
AccessToken = loggedInModel.AccessToken
@ -135,16 +136,87 @@ namespace TIAMWebApp.Server.Controllers
[AllowAnonymous]
[HttpPost]
[Route(APIUrls.RefreshTokenRouteName)]
public async Task<IActionResult> RefreshToken(RefreshTokenRequest? refreshTokenRequest)
public async Task<IActionResult> RefreshToken(AuthenticationTokens? refreshTokenRequest)
{
_logger.Info(@"RefreshToken called");
var mainResponse = await RefreshTokenSignalR(refreshTokenRequest);
return mainResponse.IsSuccess ? Ok(mainResponse) : BadRequest(mainResponse);
//_logger.Info(@"RefreshToken called");
//var response = new MainResponse();
//if (refreshTokenRequest is null)
//{
// _logger.Info(@"RefreshTokenRequest is null");
// response.ErrorMessage = "Invalid request";
// return BadRequest(response);
//}
//var principal = _loginService.GetPrincipalFromExpiredToken(refreshTokenRequest.AccessToken);
//if (principal != null)
//{
// _logger.Info(@"Principal is not null");
// var email = principal.Claims.FirstOrDefault(f => f.Type == ClaimTypes.Email);
// //var userModel = await _userManager.FindByEmailAsync(email?.Value);
// //UserModel? user = users.FirstOrDefault(x => x.Email == email?.Value);
// User? dbUser = null;
// if (email != null)
// {
// //get user from db
// dbUser = await userDal.GetUserByEmailAsync(email.Value, true);
// _logger.Info($@"DbUser email: {dbUser?.EmailAddress}");
// }
// //mocking - update userModel with new refreshToken so it returns true after the check below
// //dbUser.RefreshToken = refreshTokenRequest.RefreshToken;
// if (dbUser is null || dbUser.RefreshToken != refreshTokenRequest.RefreshToken)
// {
// response.ErrorMessage = "Invalid Request";
// _logger.Info($@"{dbUser?.RefreshToken}, {refreshTokenRequest.RefreshToken}");
// return BadRequest(response);
// }
// var newAccessToken = _loginService.GenerateAccessToken(dbUser);
// var refreshToken = _loginService.GenerateRefreshToken();
// //mocking - update userModel with new refreshToken
// dbUser.RefreshToken = refreshToken;
// //TODO await _userManager.UpdateAsync(userModel);
// await userDal.UpdateJwtRefreshTokenAsync(dbUser.EmailAddress, dbUser.RefreshToken);
// response.IsSuccess = true;
// response.Content = new AuthenticationResponse
// {
// RefreshToken = refreshToken,
// AccessToken = newAccessToken
// };
// return Ok(response);
//}
//_logger.Info(@"Principal is null");
//return NotFound("Invalid Token Found");
}
[NonAction]
[SignalR(SignalRTags.RefreshToken)]
public async Task<MainResponse> RefreshTokenSignalR(AuthenticationTokens? refreshTokenRequest)
{
_logger.Info("RefreshToken called");
var response = new MainResponse();
if (refreshTokenRequest is null)
{
_logger.Info(@"RefreshTokenRequest is null");
_logger.Info("RefreshTokenRequest is null");
response.ErrorMessage = "Invalid request";
return BadRequest(response);
return response;
}
var principal = _loginService.GetPrincipalFromExpiredToken(refreshTokenRequest.AccessToken);
@ -152,49 +224,43 @@ namespace TIAMWebApp.Server.Controllers
if (principal != null)
{
_logger.Info(@"Principal is not null");
var email = principal.Claims.FirstOrDefault(f => f.Type == ClaimTypes.Email);
//var userModel = await _userManager.FindByEmailAsync(email?.Value);
//UserModel? user = users.FirstOrDefault(x => x.Email == email?.Value);
User? dbUser = null;
if (email != null)
var emailClaim = principal.Claims.FirstOrDefault(f => f.Type == ClaimTypes.Email);
if (emailClaim != null) dbUser = await userDal.GetUserByEmailAsync(emailClaim.Value, true);
if (dbUser is null || refreshTokenRequest.RefreshToken.IsNullOrWhiteSpace() || dbUser.RefreshToken != refreshTokenRequest.RefreshToken)
{
//get user from db
dbUser = await userDal.GetUserByEmailAsync(email.Value, true);
_logger.Info($@"DbUser email: {dbUser?.EmailAddress}");
response.ErrorMessage = "User not found or RefreshToken is not valid!";
_logger.Info($"{response.ErrorMessage}; dbUser.RefreshToken: {dbUser?.RefreshToken}, refreshTokenRequest.RefreshToken: {refreshTokenRequest.RefreshToken}");
return response;
}
//mocking - update userModel with new refreshToken so it returns true after the check below
//dbUser.RefreshToken = refreshTokenRequest.RefreshToken;
if (dbUser is null || dbUser.RefreshToken != refreshTokenRequest.RefreshToken)
{
response.ErrorMessage = "Invalid Request";
_logger.Info($@"{dbUser?.RefreshToken}, {refreshTokenRequest.RefreshToken}");
return BadRequest(response);
}
_logger.Info($"DbUser email: {dbUser.EmailAddress}");
var newAccessToken = _loginService.GenerateAccessToken(dbUser);
var refreshToken = _loginService.GenerateRefreshToken();
//mocking - update userModel with new refreshToken
dbUser.RefreshToken = refreshToken;
//TODO await _userManager.UpdateAsync(userModel);
await userDal.UpdateJwtRefreshTokenAsync(dbUser.EmailAddress, dbUser.RefreshToken);
response.IsSuccess = true;
response.Content = new AuthenticationResponse
response.Content = new AuthenticationTokens
{
RefreshToken = refreshToken,
AccessToken = newAccessToken
};
return Ok(response);
response.IsSuccess = true;
}
else
{
_logger.Info($"Principal is null! AccessToken: {refreshTokenRequest.AccessToken}");
response.ErrorMessage = "Principal is null";
}
_logger.Info(@"Principal is null");
return NotFound("Invalid Token Found");
return response;
}
[AllowAnonymous]

View File

@ -1,8 +0,0 @@
namespace TIAMWebApp.Server.Models
{
public class RefreshTokenRequest
{
public string AccessToken { get; set; }
public string RefreshToken { get; set; }
}
}

View File

@ -1,9 +0,0 @@

namespace TIAMWebApp.Shared.Application.Models
{
public class AuthenticateRequestAndResponse
{
public string AccessToken { get; set; }
public string RefreshToken { get; set; }
}
}

View File

@ -1,6 +1,6 @@
namespace TIAMWebApp.Shared.Application.Models
{
public class AuthenticationResponse
public class AuthenticationTokens
{
public string? AccessToken { get; set; }
public string? RefreshToken { get; set; }

View File

@ -2,16 +2,10 @@
namespace TIAMWebApp.Shared.Application.Models.ClientSide.UI
{
public class TransferStatusModel
public class TransferStatusModel(TransferStatusType statusValue, string statusName)
{
public TransferStatusType StatusValue { get; set; }
public string StatusName { get; set; }
public TransferStatusModel(TransferStatusType statusValue, string statusName)
{
StatusValue = statusValue;
StatusName = statusName;
}
public TransferStatusType StatusValue { get; set; } = statusValue;
public string StatusName { get; set; } = statusName;
public static TransferStatusModel GetStatusModel(TransferStatusType transferStatusType)
=> AllStatuses[transferStatusType];

View File

@ -1,8 +1,10 @@
using System.Net.Http.Json;
using System.Text;
using System.Text.Json;
using AyCode.Core.Extensions;
using AyCode.Interfaces.StorageHandlers;
using AyCode.Services.Loggers;
using Microsoft.IdentityModel.Tokens;
using Newtonsoft.Json;
using TIAM.Models.Dtos.Users;
using TIAM.Services;
@ -265,38 +267,40 @@ public abstract class UserDataServiceClientBase : IUserDataService
Logger.Debug("RefreshToken() called");
var isTokenRefreshed = false;
var url = $"{Setting.ApiBaseUrl}/{APIUrls.RefreshToken}";
//var url = APIUrls.RefreshToken;
var serializedStr = JsonConvert.SerializeObject(new AuthenticateRequestAndResponse
{
RefreshToken = Setting.UserBasicDetails.RefreshToken,
AccessToken = Setting.UserBasicDetails.AccessToken
});
MainResponse? mainResponse = null;
try
{
Logger.Debug("Refreshtoken url: " + url);
var response = await Http.PostAsync(url, new StringContent(serializedStr, Encoding.UTF8, "application/json"));
if (response.IsSuccessStatusCode)
var postAuthenticationTokens = new AuthenticationTokens
{
var contentStr = await response.Content.ReadAsStringAsync();
var mainResponse = JsonConvert.DeserializeObject<MainResponse>(contentStr);
if (mainResponse.IsSuccess)
RefreshToken = Setting.UserBasicDetails.RefreshToken,
AccessToken = Setting.UserBasicDetails.AccessToken
};
mainResponse = await AdminSignalRClient.PostDataAsync<AuthenticationTokens, MainResponse>(SignalRTags.RefreshToken, postAuthenticationTokens);
if (mainResponse is { IsSuccess: true })
{
var tokenDetails = mainResponse.Content.ToJson().JsonTo<AuthenticationTokens>();
if (tokenDetails == null || string.IsNullOrWhiteSpace(tokenDetails.AccessToken) || string.IsNullOrWhiteSpace(tokenDetails.RefreshToken))
{
Logger.Error($"Refreshtoken error! tokenDetails == null || string.IsNullOrWhiteSpace(tokenDetails.AccessToken) || string.IsNullOrWhiteSpace(tokenDetails.RefreshToken); AccessToken: {tokenDetails?.AccessToken}; RefreshToken: {tokenDetails?.RefreshToken}");
}
else
{
var tokenDetails = JsonConvert.DeserializeObject<AuthenticateRequestAndResponse>(mainResponse.Content.ToString());
Setting.UserBasicDetails.AccessToken = tokenDetails.AccessToken;
Setting.UserBasicDetails.RefreshToken = tokenDetails.RefreshToken;
var userDetailsStr = JsonConvert.SerializeObject(Setting.UserBasicDetails);
var userDetailsStr = Setting.UserBasicDetails.ToJson(); //JsonConvert.SerializeObject(Setting.UserBasicDetails);
await SecureStorageHandler.SaveToSecureStorageAsync(nameof(Setting.UserBasicDetails), userDetailsStr);
isTokenRefreshed = true;
}
}
else Logger.Info($"Refreshtoken is not success! {mainResponse?.ErrorMessage ?? "mainResponse == null"}");
}
catch (Exception ex)
{
Logger.Error("Refreshtoken exception: " + ex.Message, ex);
Logger.Error($"Refreshtoken, {mainResponse?.ErrorMessage ?? "mainResponse == null"}! exception: {ex.Message}", ex);
}
return isTokenRefreshed;

View File

@ -15,12 +15,18 @@ namespace TIAMWebApp.Shared.Application.Utility
public void AddPageToHistory(string pageUrl)
{
if (_previousPages.Count > 0 && _previousPages[^1] == pageUrl) return;
_previousPages.Add(pageUrl);
}
public string GetGoBackPage()
{
return _previousPages.Count > 1 ? _previousPages[^2] : _previousPages.FirstOrDefault() ?? string.Empty;
if (_previousPages.Count == 0) return string.Empty;
_previousPages.RemoveAt(_previousPages.Count - 1);
return _previousPages.Count > 0 ? _previousPages[^1] : string.Empty;
}
public bool CanGoBack()