diff --git a/src/Application/Application.csproj b/src/Application/Application.csproj
index 3aaaa5941..891670691 100644
--- a/src/Application/Application.csproj
+++ b/src/Application/Application.csproj
@@ -23,7 +23,7 @@
-
+
diff --git a/src/Infrastructure/DependencyInjection.cs b/src/Infrastructure/DependencyInjection.cs
index a343eda60..5f4a09d98 100644
--- a/src/Infrastructure/DependencyInjection.cs
+++ b/src/Infrastructure/DependencyInjection.cs
@@ -174,8 +174,6 @@ private static IServiceCollection AddServices(this IServiceCollection services)
services.Configure(options =>
{
var identitySettings = configuration.GetRequiredSection(IdentitySettings.Key).Get();
-
-
// Password settings
options.Password.RequireDigit = identitySettings!.RequireDigit;
options.Password.RequiredLength = identitySettings.RequiredLength;
diff --git a/src/Server.UI/Pages/Identity/Authentication/Login.razor b/src/Server.UI/Pages/Identity/Authentication/Login.razor
index 80185255b..d07c40297 100644
--- a/src/Server.UI/Pages/Identity/Authentication/Login.razor
+++ b/src/Server.UI/Pages/Identity/Authentication/Login.razor
@@ -137,16 +137,17 @@
var user = await SignInManager.GetTwoFactorAuthenticationUserAsync();
var token = await UserManager.GenerateTwoFactorTokenAsync(user, "Email");
await Sender.Publish(new SendFactorCodeNotification(user.Email, user.UserName, token));
-
RedirectManager.RedirectTo(LoginWith2fa.PageUrl, new() { ["returnUrl"] = ReturnUrl, ["rememberMe"] = Input.RememberMe });
-
-
}
else if (result.IsLockedOut)
{
Logger.LogWarning($"{Input.UserName} account locked out.");
RedirectManager.RedirectTo(Lockout.PageUrl);
}
+ else if (result.IsNotAllowed)
+ {
+ errorMessage = L["Error: Your account is not allowed to log in. Please ensure your account has been activated and you have completed all required steps."];
+ }
else
{
errorMessage = L["Error: Invalid login attempt."];
diff --git a/src/Server.UI/Pages/Identity/Users/Components/UserForm.razor b/src/Server.UI/Pages/Identity/Users/Components/UserForm.razor
index 11664a598..8271e4d1c 100644
--- a/src/Server.UI/Pages/Identity/Users/Components/UserForm.razor
+++ b/src/Server.UI/Pages/Identity/Users/Components/UserForm.razor
@@ -86,7 +86,7 @@
@L["Status"]
-
+
diff --git a/src/Server.UI/Pages/Identity/Users/Users.razor b/src/Server.UI/Pages/Identity/Users/Users.razor
index cd75ebb6a..d36008c6f 100644
--- a/src/Server.UI/Pages/Identity/Users/Users.razor
+++ b/src/Server.UI/Pages/Identity/Users/Users.razor
@@ -1,5 +1,8 @@
@page "/identity/users"
+@using CleanArchitecture.Blazor.Application.Features.Identity.Notifications.ResetPassword
+@using CleanArchitecture.Blazor.Application.Features.Identity.Notifications.SendWelcome
@using FluentEmail.Core.Models
+@using Microsoft.AspNetCore.WebUtilities
@using Severity = Severity
@using LazyCache
@using CleanArchitecture.Blazor.Application.Features.Identity.DTOs
@@ -15,11 +18,13 @@
@using CleanArchitecture.Blazor.Infrastructure.Constants.Role
@using System.Reflection
@using CleanArchitecture.Blazor.Infrastructure.Constants.ClaimTypes
+@using System.Text
@attribute [Authorize(Policy = Permissions.Users.View)]
@inherits OwningComponentBase
@implements IDisposable
-
+@inject IMediator Sender
+@inject NavigationManager NavigationManager
@inject IUsersStateContainer UsersStateContainer
@inject IBlazorDownloadFileService BlazorDownloadFileService
@inject IUserService UserService
@@ -202,7 +207,7 @@
}
@if (_canRestPassword)
{
- OnResetPassword(context.Item))>@L["Reset Password"]
+ OnResetPassword(context.Item))>@L["Reset Password"]
}
}
@@ -323,6 +328,7 @@
[CascadingParameter] private Task AuthState { get; set; } = default!;
private UserManager UserManager;
private RoleManager RoleManager;
+
private int _defaultPageSize = 15;
private HashSet _selectedItems = new();
private readonly ApplicationUserDto _currentDto = new();
@@ -453,33 +459,36 @@
PhoneNumber = model.PhoneNumber,
SuperiorId = model.SuperiorId,
ProfilePictureDataUrl = model.ProfilePictureDataUrl,
- IsActive = false
+ EmailConfirmed = true,
+ IsActive = model.IsActive
};
- var state = await UserManager.CreateAsync(applicationUser);
- if (state.Succeeded)
+ var identityResult = await UserManager.CreateAsync(applicationUser);
+ if (!identityResult.Succeeded)
{
- if (model.AssignedRoles is not null && model.AssignedRoles.Length > 0)
- {
- await UserManager.AddToRolesAsync(applicationUser, model.AssignedRoles);
- }
- else
- {
- await UserManager.AddToRoleAsync(applicationUser, RoleName.Basic);
- }
- Snackbar.Add($"{ConstantString.CreateSuccess}", Severity.Info);
- Logger.LogInformation("Create a user succeeded. Username: {@UserName:l}, UserId: {@UserId}", applicationUser.UserName, applicationUser.Id);
- UserService.Refresh();
- await OnRefresh();
- var response = await SendWelcome(applicationUser.Email, applicationUser.UserName!);
- if (response.Successful == false)
- {
- Snackbar.Add(string.Format(L["{0}"], response.ErrorMessages.FirstOrDefault()), Severity.Error);
- }
+ Snackbar.Add($"{string.Join(",", identityResult.Errors.Select(x => x.Description).ToArray())}", Severity.Error);
+ return;
+ }
+ Snackbar.Add($"{L["New user created successfully."]}", Severity.Info);
+ if (model.AssignedRoles is not null && model.AssignedRoles.Length > 0)
+ {
+ await UserManager.AddToRolesAsync(applicationUser, model.AssignedRoles);
}
else
{
- Snackbar.Add($"{string.Join(",", state.Errors.Select(x => x.Description).ToArray())}", Severity.Error);
+ await UserManager.AddToRoleAsync(applicationUser, RoleName.Basic);
+ }
+ if (applicationUser.IsActive)
+ {
+ var code = await UserManager.GeneratePasswordResetTokenAsync(applicationUser);
+ await SendRestPasswordNotification(code, applicationUser.Id, applicationUser.Email, applicationUser.UserName);
+ Snackbar.Add($"Recovery email sent. Please check your inbox to set a new password.", Severity.Info);
}
+
+ Logger.LogInformation("Create a user succeeded. Username: {@UserName:l}, UserId: {@UserId}", applicationUser.UserName, applicationUser.Id);
+ UserService.Refresh();
+ await OnRefresh();
+
+
}
}
@@ -518,7 +527,7 @@
{
await UserManager.AddToRolesAsync(user, item.AssignedRoles);
}
- Snackbar.Add($"{ConstantString.SaveSuccess}", Severity.Info);
+ Snackbar.Add($"{L["The user updated successfully."]}", Severity.Info);
await OnRefresh();
UserService.Refresh();
}
@@ -624,17 +633,45 @@
private async Task OnSetActive(ApplicationUserDto item)
{
var user = await UserManager.FindByIdAsync(item.Id!) ?? throw new NotFoundException($"Application user not found {item.Id}.");
- user.IsActive = !item.IsActive;
- var state = await UserManager.UpdateAsync(user);
- item.IsActive = !item.IsActive;
- if (state.Succeeded)
+ if (!user.IsActive)
{
- Snackbar.Add($"{ConstantString.UpdateSuccess}", Severity.Info);
+ var code = await UserManager.GeneratePasswordResetTokenAsync(user);
+ await SendRestPasswordNotification(code, user.Id, user.Email, user.UserName);
+ Snackbar.Add($"Email sent. Please check your inbox to set a new password.", Severity.Info);
+
+ user.IsActive = true;
+ user.LockoutEnd = null;
+ var identityResult = await UserManager.UpdateAsync(user);
+ if (identityResult.Succeeded)
+ {
+ item.IsActive = true;
+ item.LockoutEnd = null;
+ Snackbar.Add($"{L["The user has been activated."]}", Severity.Info);
+ }
+ else
+ {
+ Snackbar.Add($"{string.Join(",", identityResult.Errors.Select(x => x.Description).ToArray())}", Severity.Error);
+ }
+
}
else
{
- Snackbar.Add($"{string.Join(",", state.Errors.Select(x => x.Description).ToArray())}", Severity.Error);
+ user.IsActive = false;
+ user.LockoutEnd = DateTimeOffset.MaxValue;
+ var identityResult = await UserManager.UpdateAsync(user);
+
+ if (identityResult.Succeeded)
+ {
+ item.IsActive = false;
+ item.LockoutEnd = DateTimeOffset.MaxValue;
+ Snackbar.Add($"{L["The user has been inactivated."]}", Severity.Info);
+ }
+ else
+ {
+ Snackbar.Add($"{string.Join(",", identityResult.Errors.Select(x => x.Description).ToArray())}", Severity.Error);
+ }
}
+
}
private async Task OnResetPassword(ApplicationUserDto item)
@@ -649,11 +686,17 @@
var result = await dialog.Result;
if (!result.Canceled)
{
- var user = await UserManager.FindByIdAsync(item.Id!);
+ var user = await UserManager.FindByIdAsync(item.Id!) ?? throw new NotFoundException($"Application user not found {item.Id}.");
+
var token = await UserManager.GeneratePasswordResetTokenAsync(user!);
var state = await UserManager.ResetPasswordAsync(user!, token, model!.Password!);
if (state.Succeeded)
{
+ if (user.EmailConfirmed == false)
+ {
+ user.EmailConfirmed = true;
+ await UserManager.UpdateAsync(user);
+ }
Snackbar.Add($"{L["Reset password successfully"]}", Severity.Info);
}
else
@@ -817,7 +860,7 @@
}).ToListAsync();
var result = await ExcelService.ExportAsync(items,
new Dictionary>
- {
+ {
{ L["Id"], item => item.Id },
{ L["User Name"], item => item.UserName },
{ L["Display Name"], item => item.DisplayName },
@@ -825,7 +868,7 @@
{ L["Phone Number"], item => item.PhoneNumber },
{ L["Tenant Id"], item => item.TenantId },
{ L["Tenant Name"], item => item.TenantName }
- }, L["Users"]);
+ }, L["Users"]);
var downloadResult = await BlazorDownloadFileService.DownloadFile($"{L["Users"]}.xlsx", result, "application/octet-stream");
Snackbar.Add($"{ConstantString.ExportSuccess}", Severity.Info);
}
@@ -883,10 +926,22 @@
_uploading = false;
}
- private Task SendWelcome(string toEmail, string userName)
+ private async Task SendWelcomeNotification(string toEmail, string userName)
+ {
+ var callbackUrl = NavigationManager.GetUriWithQueryParameters(
+ NavigationManager.ToAbsoluteUri(Login.PageUrl).AbsoluteUri,
+ new Dictionary { ["returnUrl"] = "/" });
+
+ await Sender.Publish(new SendWelcomeNotification(callbackUrl, toEmail, userName));
+ Logger.LogInformation("{UserName} Activated Successfully!", toEmail);
+ }
+ private async Task SendRestPasswordNotification(string code, string userId, string toEmail, string userName)
{
- var subject = string.Format(L["Welcome to {0}"], ApplicationSettings.AppName);
- var LoginUrl = $"{ApplicationSettings.ApplicationUrl}/pages/authentication/login";
- return MailService.SendAsync(toEmail, subject, "_welcome", new { LoginUrl, ApplicationSettings.AppName, Email = toEmail, UserName = userName, ApplicationSettings.Company });
+ code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
+ var callbackUrl = NavigationManager.GetUriWithQueryParameters(
+ NavigationManager.ToAbsoluteUri(ResetPassword.PageUrl).AbsoluteUri,
+ new Dictionary { ["userId"] = userId, ["token"] = code });
+ await Sender.Publish(new ResetPasswordNotification(callbackUrl, toEmail, userName));
+ Logger.LogInformation("Rest password email sent to {0}.", toEmail);
}
}
\ No newline at end of file
diff --git a/src/Server.UI/Resources/Pages/Identity/Authentication/Login.ca-ES.resx b/src/Server.UI/Resources/Pages/Identity/Authentication/Login.ca-ES.resx
index 3e7b0e5b1..9582a3910 100644
--- a/src/Server.UI/Resources/Pages/Identity/Authentication/Login.ca-ES.resx
+++ b/src/Server.UI/Resources/Pages/Identity/Authentication/Login.ca-ES.resx
@@ -190,4 +190,7 @@
Error: intent d'inici de sessió no vàlid.
+
+ Error: el vostre compte no té permís per iniciar sessió. Assegureu-vos que el vostre compte s'hagi activat i que hàgiu completat tots els passos necessaris.
+
\ No newline at end of file
diff --git a/src/Server.UI/Resources/Pages/Identity/Authentication/Login.de-DE.resx b/src/Server.UI/Resources/Pages/Identity/Authentication/Login.de-DE.resx
index e758a6350..a09777c36 100644
--- a/src/Server.UI/Resources/Pages/Identity/Authentication/Login.de-DE.resx
+++ b/src/Server.UI/Resources/Pages/Identity/Authentication/Login.de-DE.resx
@@ -190,4 +190,7 @@
Fehler: Ungültiger Anmeldeversuch.
+
+ Fehler: Ihr Konto darf sich nicht anmelden. Bitte stellen Sie sicher, dass Ihr Konto aktiviert wurde und Sie alle erforderlichen Schritte abgeschlossen haben.
+
\ No newline at end of file
diff --git a/src/Server.UI/Resources/Pages/Identity/Authentication/Login.en.resx b/src/Server.UI/Resources/Pages/Identity/Authentication/Login.en.resx
index 795525a09..006a139b4 100644
--- a/src/Server.UI/Resources/Pages/Identity/Authentication/Login.en.resx
+++ b/src/Server.UI/Resources/Pages/Identity/Authentication/Login.en.resx
@@ -190,4 +190,7 @@
Error: Invalid login attempt.
+
+ Error: Your account is not allowed to log in. Please ensure your account has been activated and you have completed all required steps.
+
\ No newline at end of file
diff --git a/src/Server.UI/Resources/Pages/Identity/Authentication/Login.es-ES.resx b/src/Server.UI/Resources/Pages/Identity/Authentication/Login.es-ES.resx
index fc382d4a4..bf96bed14 100644
--- a/src/Server.UI/Resources/Pages/Identity/Authentication/Login.es-ES.resx
+++ b/src/Server.UI/Resources/Pages/Identity/Authentication/Login.es-ES.resx
@@ -190,4 +190,7 @@
Error: intento de inicio de sesión no válido.
+
+ Error: Su cuenta no puede iniciar sesión. Asegúrese de que su cuenta haya sido activada y de haber completado todos los pasos requeridos.
+
\ No newline at end of file
diff --git a/src/Server.UI/Resources/Pages/Identity/Authentication/Login.fr-FR.resx b/src/Server.UI/Resources/Pages/Identity/Authentication/Login.fr-FR.resx
index 430da142d..bf8ac3b69 100644
--- a/src/Server.UI/Resources/Pages/Identity/Authentication/Login.fr-FR.resx
+++ b/src/Server.UI/Resources/Pages/Identity/Authentication/Login.fr-FR.resx
@@ -190,4 +190,7 @@
Erreur : tentative de connexion invalide.
+
+ Erreur : Votre compte n'est pas autorisé à se connecter. Veuillez vous assurer que votre compte a été activé et que vous avez effectué toutes les étapes requises.
+
\ No newline at end of file
diff --git a/src/Server.UI/Resources/Pages/Identity/Authentication/Login.ja-JP.resx b/src/Server.UI/Resources/Pages/Identity/Authentication/Login.ja-JP.resx
index 6d0ef0595..2243f64fe 100644
--- a/src/Server.UI/Resources/Pages/Identity/Authentication/Login.ja-JP.resx
+++ b/src/Server.UI/Resources/Pages/Identity/Authentication/Login.ja-JP.resx
@@ -190,4 +190,7 @@
エラー: 無効なログイン試行です。
+
+ エラー: あなたのアカウントではログインが許可されていません。アカウントがアクティブ化されていて、必要な手順がすべて完了していることを確認してください。
+
\ No newline at end of file
diff --git a/src/Server.UI/Resources/Pages/Identity/Authentication/Login.km-KH.resx b/src/Server.UI/Resources/Pages/Identity/Authentication/Login.km-KH.resx
index e79001fc3..3f56bfd71 100644
--- a/src/Server.UI/Resources/Pages/Identity/Authentication/Login.km-KH.resx
+++ b/src/Server.UI/Resources/Pages/Identity/Authentication/Login.km-KH.resx
@@ -190,4 +190,7 @@
កំហុស៖ ការព្យាយាមចូលមិនត្រឹមត្រូវ។
+
+ កំហុស៖ គណនីរបស់អ្នកមិនត្រូវបានអនុញ្ញាតឱ្យចូលទេ។ សូមប្រាកដថាគណនីរបស់អ្នកត្រូវបានធ្វើឱ្យសកម្ម ហើយអ្នកបានបញ្ចប់ជំហានដែលត្រូវការទាំងអស់។
+
\ No newline at end of file
diff --git a/src/Server.UI/Resources/Pages/Identity/Authentication/Login.ko-KR.resx b/src/Server.UI/Resources/Pages/Identity/Authentication/Login.ko-KR.resx
index 266a63155..d094054cf 100644
--- a/src/Server.UI/Resources/Pages/Identity/Authentication/Login.ko-KR.resx
+++ b/src/Server.UI/Resources/Pages/Identity/Authentication/Login.ko-KR.resx
@@ -186,4 +186,7 @@
오류: 잘못된 로그인 시도입니다.
+
+ 오류: 귀하의 계정은 로그인이 허용되지 않습니다. 귀하의 계정이 활성화되었고 모든 필수 단계를 완료했는지 확인하십시오.
+
\ No newline at end of file
diff --git a/src/Server.UI/Resources/Pages/Identity/Authentication/Login.resx b/src/Server.UI/Resources/Pages/Identity/Authentication/Login.resx
index 1623e3529..55249fa08 100644
--- a/src/Server.UI/Resources/Pages/Identity/Authentication/Login.resx
+++ b/src/Server.UI/Resources/Pages/Identity/Authentication/Login.resx
@@ -190,4 +190,7 @@
Error: Invalid login attempt.
+
+ Error: Your account is not allowed to log in. Please ensure your account has been activated and you have completed all required steps.
+
\ No newline at end of file
diff --git a/src/Server.UI/Resources/Pages/Identity/Authentication/Login.ru.resx b/src/Server.UI/Resources/Pages/Identity/Authentication/Login.ru.resx
index 14adf0c90..0965ca6c4 100644
--- a/src/Server.UI/Resources/Pages/Identity/Authentication/Login.ru.resx
+++ b/src/Server.UI/Resources/Pages/Identity/Authentication/Login.ru.resx
@@ -190,4 +190,7 @@
Ошибка: Неверная попытка входа.
+
+ Ошибка: вашей учетной записи не разрешен вход в систему. Убедитесь, что ваша учетная запись активирована и вы выполнили все необходимые шаги.
+
\ No newline at end of file
diff --git a/src/Server.UI/Resources/Pages/Identity/Authentication/Login.zh-CN.resx b/src/Server.UI/Resources/Pages/Identity/Authentication/Login.zh-CN.resx
index 1f783a98d..ae61d6517 100644
--- a/src/Server.UI/Resources/Pages/Identity/Authentication/Login.zh-CN.resx
+++ b/src/Server.UI/Resources/Pages/Identity/Authentication/Login.zh-CN.resx
@@ -190,4 +190,7 @@
错误:登录尝试无效。
+
+ 错误:您的帐户不允许登录。请确保您的帐户已激活并且您已完成所有必需的步骤。
+
\ No newline at end of file
diff --git a/src/Server.UI/Resources/Pages/Identity/Users/Users.ca-ES.resx b/src/Server.UI/Resources/Pages/Identity/Users/Users.ca-ES.resx
index 450b8d98b..72e105d56 100644
--- a/src/Server.UI/Resources/Pages/Identity/Users/Users.ca-ES.resx
+++ b/src/Server.UI/Resources/Pages/Identity/Users/Users.ca-ES.resx
@@ -235,4 +235,19 @@
Permís assignat correctament
+
+ L'usuari s'ha actualitzat correctament.
+
+
+ L'usuari ha estat desactivat.
+
+
+ L'usuari ha estat activat.
+
+
+ Correu electrònic de recuperació enviat. Si us plau, comproveu la vostra safata d'entrada per establir una nova contrasenya.
+
+
+ Usuari nou creat correctament.
+
\ No newline at end of file
diff --git a/src/Server.UI/Resources/Pages/Identity/Users/Users.de-DE.resx b/src/Server.UI/Resources/Pages/Identity/Users/Users.de-DE.resx
index 162aafbc7..48313db34 100644
--- a/src/Server.UI/Resources/Pages/Identity/Users/Users.de-DE.resx
+++ b/src/Server.UI/Resources/Pages/Identity/Users/Users.de-DE.resx
@@ -235,4 +235,19 @@
Berechtigung erfolgreich zugewiesen
+
+ Der Benutzer wurde erfolgreich aktualisiert.
+
+
+ Der Benutzer wurde inaktiviert.
+
+
+ Der Benutzer wurde aktiviert.
+
+
+ Wiederherstellungs-E-Mail gesendet. Bitte überprüfen Sie Ihren Posteingang, um ein neues Passwort festzulegen.
+
+
+ Neuer Benutzer erfolgreich erstellt.
+
\ No newline at end of file
diff --git a/src/Server.UI/Resources/Pages/Identity/Users/Users.en.resx b/src/Server.UI/Resources/Pages/Identity/Users/Users.en.resx
index faebf6cb5..21a91ca13 100644
--- a/src/Server.UI/Resources/Pages/Identity/Users/Users.en.resx
+++ b/src/Server.UI/Resources/Pages/Identity/Users/Users.en.resx
@@ -235,4 +235,19 @@
Permission assigned successfully
+
+ The user updated successfully.
+
+
+ The user has been inactivated.
+
+
+ The user has been activated.
+
+
+ Recovery email sent. Please check your inbox to set a new password.
+
+
+ New user created successfully.
+
\ No newline at end of file
diff --git a/src/Server.UI/Resources/Pages/Identity/Users/Users.es-ES.resx b/src/Server.UI/Resources/Pages/Identity/Users/Users.es-ES.resx
index db3159360..8dc9363e8 100644
--- a/src/Server.UI/Resources/Pages/Identity/Users/Users.es-ES.resx
+++ b/src/Server.UI/Resources/Pages/Identity/Users/Users.es-ES.resx
@@ -235,4 +235,19 @@
Permiso asignado exitosamente
+
+ El usuario se actualizó exitosamente.
+
+
+ El usuario ha sido desactivado.
+
+
+ El usuario ha sido activado.
+
+
+ Correo electrónico de recuperación enviado. Por favor revise su bandeja de entrada para establecer una nueva contraseña.
+
+
+ Nuevo usuario creado exitosamente.
+
\ No newline at end of file
diff --git a/src/Server.UI/Resources/Pages/Identity/Users/Users.fr-FR.resx b/src/Server.UI/Resources/Pages/Identity/Users/Users.fr-FR.resx
index bdfb03d14..fe65e010f 100644
--- a/src/Server.UI/Resources/Pages/Identity/Users/Users.fr-FR.resx
+++ b/src/Server.UI/Resources/Pages/Identity/Users/Users.fr-FR.resx
@@ -235,4 +235,19 @@
Autorisation attribuée avec succès
+
+ L'utilisateur a mis à jour avec succès.
+
+
+ L'utilisateur a été inactivé.
+
+
+ L'utilisateur a été activé.
+
+
+ E-mail de récupération envoyé. Veuillez vérifier votre boîte de réception pour définir un nouveau mot de passe.
+
+
+ Nouvel utilisateur créé avec succès.
+
\ No newline at end of file
diff --git a/src/Server.UI/Resources/Pages/Identity/Users/Users.ja-JP.resx b/src/Server.UI/Resources/Pages/Identity/Users/Users.ja-JP.resx
index a713cf8d9..1c797e350 100644
--- a/src/Server.UI/Resources/Pages/Identity/Users/Users.ja-JP.resx
+++ b/src/Server.UI/Resources/Pages/Identity/Users/Users.ja-JP.resx
@@ -235,4 +235,19 @@
権限が正常に割り当てられました
+
+ ユーザーは正常に更新されました。
+
+
+ ユーザーは非アクティブ化されました。
+
+
+ ユーザーがアクティブ化されました。
+
+
+ 回復メールが送信されました。 受信箱を確認して新しいパスワードを設定してください。
+
+
+ 新しいユーザーが正常に作成されました。
+
\ No newline at end of file
diff --git a/src/Server.UI/Resources/Pages/Identity/Users/Users.km-KH.resx b/src/Server.UI/Resources/Pages/Identity/Users/Users.km-KH.resx
index be7fed461..2bd5f67ba 100644
--- a/src/Server.UI/Resources/Pages/Identity/Users/Users.km-KH.resx
+++ b/src/Server.UI/Resources/Pages/Identity/Users/Users.km-KH.resx
@@ -235,4 +235,19 @@
ការអនុញ្ញាតត្រូវបានផ្តល់ដោយជោគជ័យ
+
+ អ្នកប្រើប្រាស់បានធ្វើបច្ចុប្បន្នភាពដោយជោគជ័យ។
+
+
+ អ្នកប្រើប្រាស់ត្រូវបានអសកម្ម។
+
+
+ អ្នកប្រើប្រាស់ត្រូវបានធ្វើឱ្យសកម្ម។
+
+
+ បានផ្ញើអ៊ីមែលសង្គ្រោះ។ សូមពិនិត្យមើលប្រអប់សំបុត្ររបស់អ្នកដើម្បីកំណត់ពាក្យសម្ងាត់ថ្មី។
+
+
+ អ្នកប្រើប្រាស់ថ្មីបានបង្កើតដោយជោគជ័យ។
+
\ No newline at end of file
diff --git a/src/Server.UI/Resources/Pages/Identity/Users/Users.ko-KR.resx b/src/Server.UI/Resources/Pages/Identity/Users/Users.ko-KR.resx
index b5ba07999..666b4b743 100644
--- a/src/Server.UI/Resources/Pages/Identity/Users/Users.ko-KR.resx
+++ b/src/Server.UI/Resources/Pages/Identity/Users/Users.ko-KR.resx
@@ -231,4 +231,19 @@
권한이 할당되었습니다.
+
+ 사용자가 성공적으로 업데이트되었습니다.
+
+
+ 사용자가 비활성화되었습니다.
+
+
+ 사용자가 활성화되었습니다.
+
+
+ 복구 이메일이 전송되었습니다. 새 비밀번호를 설정하려면 받은 편지함을 확인하세요.
+
+
+ 새 사용자가 성공적으로 생성되었습니다.
+
\ No newline at end of file
diff --git a/src/Server.UI/Resources/Pages/Identity/Users/Users.resx b/src/Server.UI/Resources/Pages/Identity/Users/Users.resx
index fe4d3d8a6..95fd55fce 100644
--- a/src/Server.UI/Resources/Pages/Identity/Users/Users.resx
+++ b/src/Server.UI/Resources/Pages/Identity/Users/Users.resx
@@ -235,4 +235,19 @@
Permission assigned successfully
+
+ Recovery email sent. Please check your inbox to set a new password.
+
+
+ The user has been activated.
+
+
+ The user has been inactivated.
+
+
+ New user created successfully.
+
+
+ The user updated successfully.
+
\ No newline at end of file
diff --git a/src/Server.UI/Resources/Pages/Identity/Users/Users.ru.resx b/src/Server.UI/Resources/Pages/Identity/Users/Users.ru.resx
index 6c5880ce2..53a6c8839 100644
--- a/src/Server.UI/Resources/Pages/Identity/Users/Users.ru.resx
+++ b/src/Server.UI/Resources/Pages/Identity/Users/Users.ru.resx
@@ -235,4 +235,19 @@
Разрешение успешно получено
+
+ Пользователь успешно обновился.
+
+
+ Пользователь деактивирован.
+
+
+ Пользователь активирован.
+
+
+ Письмо для восстановления отправлено. Пожалуйста, проверьте свой почтовый ящик, чтобы установить новый пароль.
+
+
+ Новый пользователь успешно создан.
+
\ No newline at end of file
diff --git a/src/Server.UI/Resources/Pages/Identity/Users/Users.zh-CN.resx b/src/Server.UI/Resources/Pages/Identity/Users/Users.zh-CN.resx
index 85fcfd94f..fe2b49488 100644
--- a/src/Server.UI/Resources/Pages/Identity/Users/Users.zh-CN.resx
+++ b/src/Server.UI/Resources/Pages/Identity/Users/Users.zh-CN.resx
@@ -235,4 +235,19 @@
权限分配成功
+
+ 用户更新成功。
+
+
+ 该用户已被停用。
+
+
+ 用户已被激活。
+
+
+ 恢复电子邮件已发送。 请检查您的收件箱以设置新密码。
+
+
+ 新用户创建成功。
+
\ No newline at end of file
diff --git a/src/Server.UI/appsettings.json b/src/Server.UI/appsettings.json
index c9989d722..39a192906 100644
--- a/src/Server.UI/appsettings.json
+++ b/src/Server.UI/appsettings.json
@@ -87,7 +87,7 @@
},
"IdentitySettings": {
"RequireDigit": false,
- "RequiredLength": 2,
+ "RequiredLength": 6,
"MaxLength": 16,
"RequireNonAlphanumeric": false,
"RequireUpperCase": false,
diff --git a/src/Server/Server.csproj b/src/Server/Server.csproj
index 4414e926e..1c5da77f0 100644
--- a/src/Server/Server.csproj
+++ b/src/Server/Server.csproj
@@ -11,7 +11,7 @@
-
+
@@ -23,7 +23,7 @@
-
+