diff --git a/Resources/ChangeLog.html b/Resources/ChangeLog.html
index 0b031ba..e8d30c7 100644
--- a/Resources/ChangeLog.html
+++ b/Resources/ChangeLog.html
@@ -1,6 +1,6 @@
WebDoorCreator - Egalware
- Version: 0.9.2305.2910
+ Version: 0.9.2305.2916
Release note:
-
diff --git a/Resources/VersNum.txt b/Resources/VersNum.txt
index f79ab77..96454e3 100644
--- a/Resources/VersNum.txt
+++ b/Resources/VersNum.txt
@@ -1 +1 @@
-0.9.2305.2910
+0.9.2305.2916
diff --git a/Resources/manifest.xml b/Resources/manifest.xml
index 527d040..017c23f 100644
--- a/Resources/manifest.xml
+++ b/Resources/manifest.xml
@@ -1,6 +1,6 @@
-
- 0.9.2305.2910
+ 0.9.2305.2916
http://nexus.steamware.net/repository/SWS/WDC/stable/WDC.UI.zip
http://nexus.steamware.net/repository/SWS/WDC/stable/ChangeLog.html
false
diff --git a/WebDoorCreator.Core/Constants.cs b/WebDoorCreator.Core/Constants.cs
index 3635835..634c6ca 100644
--- a/WebDoorCreator.Core/Constants.cs
+++ b/WebDoorCreator.Core/Constants.cs
@@ -50,8 +50,8 @@ namespace WebDoorCreator.Core
public const string rKeyRoles = $"{redisBaseAddr}:Cache:Roles";
public const string rKeyUsers = $"{redisBaseAddr}:Cache:Users";
public const string rKeyUsersAll = $"{redisBaseAddr}:Cache:UsersAll";
- public const string rKeyUsersDataId = $"{redisBaseAddr}:Cache:UsersData:Id";
- public const string rKeyUsersDataSearch = $"{redisBaseAddr}:Cache:UsersData:Search";
+ public const string rKeyUsersData = $"{redisBaseAddr}:Cache:UsersData";
+ public const string rKeyUsersDataSearch = $"{rKeyUsersData}:Search";
public const string rKeyUsersView = $"{redisBaseAddr}:Cache:UsersView";
public const string rKeyVocLemma = $"{redisBaseAddr}:Cache:VocLemma";
public const string rKeyLanguage = $"{redisBaseAddr}:Cache:Languages";
diff --git a/WebDoorCreator.Data/User/ClaimConverter.cs b/WebDoorCreator.Data/User/ClaimConverter.cs
new file mode 100644
index 0000000..4351f40
--- /dev/null
+++ b/WebDoorCreator.Data/User/ClaimConverter.cs
@@ -0,0 +1,40 @@
+using Newtonsoft.Json.Linq;
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Security.Claims;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace WebDoorCreator.Data.User
+{
+ public class ClaimConverter : JsonConverter
+ {
+ public override bool CanConvert(Type objectType)
+ {
+ return (objectType == typeof(System.Security.Claims.Claim));
+ }
+
+ public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
+ {
+ JObject jo = JObject.Load(reader);
+ string type = (string)jo["Type"];
+ string value = (string)jo["Value"];
+ string valueType = (string)jo["ValueType"];
+ string issuer = (string)jo["Issuer"];
+ string originalIssuer = (string)jo["OriginalIssuer"];
+ return new Claim(type, value, valueType, issuer, originalIssuer);
+ }
+
+ public override bool CanWrite
+ {
+ get { return false; }
+ }
+
+ public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/WebDoorCreator.Data/User/UserData.cs b/WebDoorCreator.Data/User/UserData.cs
index c6788c6..01f76a4 100644
--- a/WebDoorCreator.Data/User/UserData.cs
+++ b/WebDoorCreator.Data/User/UserData.cs
@@ -1,4 +1,5 @@
using Microsoft.AspNetCore.Identity;
+using Newtonsoft.Json;
using System.Security.Claims;
namespace WebDoorCreator.Data.User
@@ -10,7 +11,6 @@ namespace WebDoorCreator.Data.User
public class UserData
{
#region Public Properties
-
public List Claims { get; set; } = new List();
public IdentityUser Identity { get; set; } = null!;
diff --git a/WebDoorCreator.UI/Data/WDCUserService.cs b/WebDoorCreator.UI/Data/WDCUserService.cs
index 46c5973..31fd410 100644
--- a/WebDoorCreator.UI/Data/WDCUserService.cs
+++ b/WebDoorCreator.UI/Data/WDCUserService.cs
@@ -4,6 +4,7 @@ using Newtonsoft.Json;
using NLog;
using StackExchange.Redis;
using System.Diagnostics;
+using System.Security.Claims;
using WebDoorCreator.Core;
using WebDoorCreator.Data.User;
@@ -118,6 +119,27 @@ namespace WebDoorCreator.UI.Data
#region Public Methods
+ ///
+ /// Effettua reset dati utente...
+ ///
+ /// Indica reset completo (anche dati elenco di base)
+ ///
+ public async Task ResetUserDataCache(bool resetAll)
+ {
+ bool fatto = false;
+ RedisValue pattern = new RedisValue($"{Constants.rKeyUsersAll}");
+ if (resetAll)
+ {
+ fatto = await ExecFlushRedisPattern(pattern);
+ }
+ // ora resetto il resto
+ pattern = new RedisValue($"{Constants.rKeyUsersData}:*");
+ fatto = fatto && await ExecFlushRedisPattern(pattern);
+ //pattern = new RedisValue($"{Constants.rKeyUsersDataSearch}:*");
+ //fatto = fatto && await ExecFlushRedisPattern(pattern);
+ return fatto;
+ }
+
///
/// Dati utente (TUTTI) da REDIS o DB
///
@@ -161,66 +183,37 @@ namespace WebDoorCreator.UI.Data
}
///
- /// Dati utente (singolo x UserId)
+ /// Dati utente (singolo x searchVal)
///
///
///
public async Task UserDataGetById(string UserId)
{
- string source = "DB";
+ string source = "FULL";
UserData dataResult = new UserData();
- // cerco da cache
- string currKey = $"{Constants.rKeyUsersDataId}:{UserId}";
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
- string? rawData = "";// await redisDb.StringGetAsync(currKey);
- if (!string.IsNullOrEmpty(rawData))
+ // uso metodi helper protected di base...
+ var userRaw = await UserIdentityById(UserId);
+ var userIdent = new IdentityUser
{
- source = "REDIS";
- var tempResult = JsonConvert.DeserializeObject(rawData);
- if (tempResult == null)
- {
- dataResult = new UserData();
- }
- else
- {
- dataResult = tempResult;
- }
- }
- else
+ Id = userRaw.Id,
+ UserName = userRaw.UserName,
+ Email = userRaw.Email,
+ PhoneNumber = userRaw.PhoneNumber,
+ PasswordHash = "*****",
+ EmailConfirmed = userRaw.EmailConfirmed
+ };
+ // cerco ruoli & claims
+ var UserRoles = await UserRolesById(userIdent);
+ var UserClaims = await UserClaimsById(userIdent);
+ // compongo output
+ dataResult = new UserData()
{
- // Collezione dati raw
- var userRaw = await _userManager.FindByIdAsync(UserId);
- if (userRaw != null)
- {
- var userIdent = new IdentityUser
- {
- Id = userRaw.Id,
- UserName = userRaw.UserName,
- Email = userRaw.Email,
- PhoneNumber = userRaw.PhoneNumber,
- PasswordHash = "*****",
- EmailConfirmed = userRaw.EmailConfirmed
- };
- // cerco ruoli & claims
- var UserRoles = await _userManager.GetRolesAsync(userIdent);
- var UserClaims = await _userManager.GetClaimsAsync(userIdent);
- // compongo output
- dataResult = new UserData()
- {
- Identity = userIdent,
- Roles = UserRoles.ToList(),
- Claims = UserClaims.ToList()
- };
-
- rawData = JsonConvert.SerializeObject(dataResult, JSSettings);
- await redisDb.StringSetAsync(currKey, rawData, FastCache);
- }
- }
- if (dataResult == null)
- {
- dataResult = new UserData();
- }
+ Identity = userIdent,
+ Roles = UserRoles,
+ Claims = UserClaims
+ };
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
Log.Debug($"UserDataGetById | {source} in: {ts.TotalMilliseconds} ms");
@@ -228,75 +221,41 @@ namespace WebDoorCreator.UI.Data
}
///
- /// Dati utente (filtrati da UserId)
+ /// Dati utente (filtrati da searchVal)
///
///
///
public async Task
> UserDataGetFilt(string searchVal)
{
- string source = "DB";
+ string source = "FULL";
List dataResult = new List();
- // cerco da cache
- string currKey = $"{Constants.rKeyUsersDataSearch}:{searchVal}";
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
- string? rawData = "";// await redisDb.StringGetAsync(currKey);
- if (!string.IsNullOrEmpty(rawData))
+ // uso metodi helper protected di base...
+ List RawList = await UserIdentityBySearch(searchVal);
+ // conversione
+ var user = RawList.Select(x => new IdentityUser
{
- source = "REDIS";
- var tempResult = JsonConvert.DeserializeObject>(rawData);
- if (tempResult == null)
- {
- dataResult = new List();
- }
- else
- {
- dataResult = tempResult;
- }
- }
- else
+ Id = x.Id,
+ UserName = x.UserName,
+ Email = x.Email,
+ PhoneNumber = x.PhoneNumber,
+ PasswordHash = "*****",
+ EmailConfirmed = x.EmailConfirmed
+ }).ToList();
+ foreach (var item in user)
{
- // Collezione dati raw
- List RawList = new List();
- //List UsersList = new List();
- var allData = await UserDataGetAll();
- if (!string.IsNullOrEmpty(searchVal))
- {
- RawList = allData.Where(x => x.NormalizedEmail.Contains(searchVal.ToUpper()) || x.NormalizedUserName.Contains(searchVal.ToUpper())).ToList();
- }
- else
- {
- RawList = allData;
- }
- var user = RawList.Select(x => new IdentityUser
- {
- Id = x.Id,
- UserName = x.UserName,
- Email = x.Email,
- PhoneNumber = x.PhoneNumber,
- PasswordHash = "*****",
- EmailConfirmed = x.EmailConfirmed
- }).ToList();
+ // cerco ruoli & claims
+ var UserRoles = await UserRolesById(item);
+ var UserClaims = await UserClaimsById(item);
- foreach (var item in user)
+ var newItem = new UserData()
{
- var UserRoles = await _userManager.GetRolesAsync(item);
- var UserClaims = await _userManager.GetClaimsAsync(item);
-
- var newItem = new UserData()
- {
- Identity = item,
- Roles = UserRoles.ToList(),
- Claims = UserClaims.ToList()
- };
- dataResult.Add(newItem);
- }
- rawData = JsonConvert.SerializeObject(dataResult, JSSettings);
- await redisDb.StringSetAsync(currKey, rawData, FastCache);
- }
- if (dataResult == null)
- {
- dataResult = new List();
+ Identity = item,
+ Roles = UserRoles,
+ Claims = UserClaims
+ };
+ dataResult.Add(newItem);
}
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
@@ -304,27 +263,6 @@ namespace WebDoorCreator.UI.Data
return dataResult;
}
- ///
- /// Effettua reset dati utente...
- ///
- /// Indica reset completo (anche dati elenco di base)
- ///
- public async Task ResetUserDataCache(bool resetAll)
- {
- bool fatto = false;
- RedisValue pattern = new RedisValue($"{Constants.rKeyUsersAll}");
- if (resetAll)
- {
- fatto = await ExecFlushRedisPattern(pattern);
- }
- // ora resetto il resto
- pattern = new RedisValue($"{Constants.rKeyUsersDataId}:*");
- fatto = fatto && await ExecFlushRedisPattern(pattern);
- pattern = new RedisValue($"{Constants.rKeyUsersDataSearch}:*");
- fatto = fatto && await ExecFlushRedisPattern(pattern);
- return fatto;
- }
-
#endregion Public Methods
#region Protected Methods
@@ -369,6 +307,169 @@ namespace WebDoorCreator.UI.Data
}
}
+ ///
+ /// Dati utente CLAIMS da REDIS o DB
+ ///
+ ///
+ protected async Task> UserClaimsById(IdentityUser UserIdent)
+ {
+ string source = "DB";
+ List dataResult = new List();
+ // cerco da cache
+ string currKey = $"{Constants.rKeyUsersData}:Claims:{UserIdent.Id}";
+ Stopwatch stopWatch = new Stopwatch();
+ stopWatch.Start();
+ string? rawData = await redisDb.StringGetAsync(currKey);
+ if (!string.IsNullOrEmpty(rawData))
+ {
+ source = "REDIS";
+ var tempResult = JsonConvert.DeserializeObject>(rawData, new ClaimConverter());
+ if (tempResult != null)
+ {
+ dataResult = tempResult;
+ }
+ }
+ else
+ {
+ var rawResult = await _userManager.GetClaimsAsync(UserIdent);
+ dataResult = rawResult.ToList();
+ rawData = JsonConvert.SerializeObject(dataResult, JSSettings);
+ await redisDb.StringSetAsync(currKey, rawData, LongCache);
+ }
+ if (dataResult == null)
+ {
+ dataResult = new List();
+ }
+ stopWatch.Stop();
+ TimeSpan ts = stopWatch.Elapsed;
+ Log.Debug($"UserClaimsById | {source} in: {ts.TotalMilliseconds} ms");
+ return dataResult;
+ }
+
+ ///
+ /// Dati utente IDENTITY da REDIS o DB
+ ///
+ ///
+ protected async Task UserIdentityById(string UserId)
+ {
+ string source = "DB";
+ IdentityUser dataResult = new IdentityUser();
+ // cerco da cache
+ string currKey = $"{Constants.rKeyUsersData}:Identity:{UserId}";
+ Stopwatch stopWatch = new Stopwatch();
+ stopWatch.Start();
+ string? rawData = await redisDb.StringGetAsync(currKey);
+ if (!string.IsNullOrEmpty(rawData))
+ {
+ source = "REDIS";
+ var tempResult = JsonConvert.DeserializeObject(rawData);
+ if (tempResult != null)
+ {
+ dataResult = tempResult;
+ }
+ }
+ else
+ {
+ dataResult = await _userManager.FindByIdAsync(UserId);
+ rawData = JsonConvert.SerializeObject(dataResult, JSSettings);
+ await redisDb.StringSetAsync(currKey, rawData, LongCache);
+ }
+ if (dataResult == null)
+ {
+ dataResult = new IdentityUser();
+ }
+ stopWatch.Stop();
+ TimeSpan ts = stopWatch.Elapsed;
+ Log.Debug($"UserIdentityById | {source} in: {ts.TotalMilliseconds} ms");
+ return dataResult;
+ }
+
+ ///
+ /// Dati utente IDENTITY in modalità SEARCH da REDIS o DB
+ ///
+ ///
+ protected async Task> UserIdentityBySearch(string searchVal)
+ {
+ string source = "DB";
+ List dataResult = new List();
+ // cerco da cache
+ string currKey = $"{Constants.rKeyUsersDataSearch}:{searchVal}";
+ Stopwatch stopWatch = new Stopwatch();
+ stopWatch.Start();
+ string? rawData = await redisDb.StringGetAsync(currKey);
+ if (!string.IsNullOrEmpty(rawData))
+ {
+ source = "REDIS";
+ var tempResult = JsonConvert.DeserializeObject>(rawData);
+ if (tempResult != null)
+ {
+ dataResult = tempResult;
+ }
+ }
+ else
+ {
+ var allData = await UserDataGetAll();
+ if (!string.IsNullOrEmpty(searchVal))
+ {
+ dataResult = allData
+ .Where(x => x.NormalizedEmail.Contains(searchVal.ToUpper()) || x.NormalizedUserName.Contains(searchVal.ToUpper())).ToList();
+ }
+ else
+ {
+ dataResult = allData;
+ }
+ rawData = JsonConvert.SerializeObject(dataResult, JSSettings);
+ await redisDb.StringSetAsync(currKey, rawData, LongCache);
+ }
+ if (dataResult == null)
+ {
+ dataResult = new List();
+ }
+ stopWatch.Stop();
+ TimeSpan ts = stopWatch.Elapsed;
+ Log.Debug($"UserIdentityBySearch | {source} in: {ts.TotalMilliseconds} ms");
+ return dataResult;
+ }
+
+ ///
+ /// Dati utente ROLES da REDIS o DB
+ ///
+ ///
+ protected async Task> UserRolesById(IdentityUser UserIdent)
+ {
+ string source = "DB";
+ List dataResult = new List();
+ // cerco da cache
+ string currKey = $"{Constants.rKeyUsersData}:Roles:{UserIdent.Id}";
+ Stopwatch stopWatch = new Stopwatch();
+ stopWatch.Start();
+ string? rawData = await redisDb.StringGetAsync(currKey);
+ if (!string.IsNullOrEmpty(rawData))
+ {
+ source = "REDIS";
+ var tempResult = JsonConvert.DeserializeObject>(rawData);
+ if (tempResult != null)
+ {
+ dataResult = tempResult;
+ }
+ }
+ else
+ {
+ var rawResult = await _userManager.GetRolesAsync(UserIdent);
+ dataResult = rawResult.ToList();
+ rawData = JsonConvert.SerializeObject(dataResult, JSSettings);
+ await redisDb.StringSetAsync(currKey, rawData, LongCache);
+ }
+ if (dataResult == null)
+ {
+ dataResult = new List();
+ }
+ stopWatch.Stop();
+ TimeSpan ts = stopWatch.Elapsed;
+ Log.Debug($"UserRolesById | {source} in: {ts.TotalMilliseconds} ms");
+ return dataResult;
+ }
+
#endregion Protected Methods
#region Private Fields
diff --git a/WebDoorCreator.UI/Pages/UserAdmin.razor.cs b/WebDoorCreator.UI/Pages/UserAdmin.razor.cs
index aceb423..0927070 100644
--- a/WebDoorCreator.UI/Pages/UserAdmin.razor.cs
+++ b/WebDoorCreator.UI/Pages/UserAdmin.razor.cs
@@ -4,6 +4,7 @@ using Microsoft.AspNetCore.Components.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.JSInterop;
using System.Linq;
+using System.Security.Claims;
using WebDoorCreator.Data.DbModels;
using WebDoorCreator.Data.Services;
using WebDoorCreator.Data.User;
@@ -57,7 +58,7 @@ namespace WebDoorCreator.UI.Pages
#region Public Methods
- public List ConvertClaim(List ClaimList)
+ public List ConvertClaim(List ClaimList)
{
List answ = new List();
@@ -164,7 +165,6 @@ namespace WebDoorCreator.UI.Pages
// filtro visualizzazione x Company, SE richeisto
if (FiltCompany != "0")
{
- System.Security.Claims.Claim cClaim = new System.Security.Claims.Claim("CompanyId", $"{FiltCompany}");
UsersAll = UsersAll
.Where(x => x.Claims.Any(c => c.Type == "CompanyId" && c.Value == $"{FiltCompany}"))
.ToList();
@@ -180,7 +180,7 @@ namespace WebDoorCreator.UI.Pages
StateHasChanged();
}
- public string ShowClaims(List ClaimList)
+ public string ShowClaims(List ClaimList)
{
string answ = string.Join(",", ConvertClaim(ClaimList));
return answ;
@@ -321,9 +321,9 @@ namespace WebDoorCreator.UI.Pages
[Inject]
private IConfiguration Configuration { get; set; } = null!;
- private System.Security.Claims.Claim CurrentUserClaim
+ private Claim CurrentUserClaim
{
- get => new System.Security.Claims.Claim(CurrentUserClaimType, CurrentUserClaimVal);
+ get => new Claim(CurrentUserClaimType, CurrentUserClaimVal);
}
///
diff --git a/WebDoorCreator.UI/WebDoorCreator.UI.csproj b/WebDoorCreator.UI/WebDoorCreator.UI.csproj
index 9c1b69f..31b6481 100644
--- a/WebDoorCreator.UI/WebDoorCreator.UI.csproj
+++ b/WebDoorCreator.UI/WebDoorCreator.UI.csproj
@@ -3,7 +3,7 @@
net6.0
enable
- 0.9.2305.2910
+ 0.9.2305.2916
enable
aspnet-WebDoorCreator.UI-dfe95fed-1398-4144-bd43-8b3a765d6608