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 @@ - +