diff --git a/Oqtane.Client/Modules/Admin/Login/Index.razor b/Oqtane.Client/Modules/Admin/Login/Index.razor index a7a92ffda..850072f12 100644 --- a/Oqtane.Client/Modules/Admin/Login/Index.razor +++ b/Oqtane.Client/Modules/Admin/Login/Index.razor @@ -11,9 +11,6 @@ ... - -
@Localizer["Info.SignedIn"]
-
@if (!twofactor) { @@ -69,259 +66,265 @@ @code { - private bool _allowsitelogin = true; - private bool _allowexternallogin = false; - private ElementReference login; - private bool validated = false; - private bool twofactor = false; - private string _username = string.Empty; - private ElementReference username; - private string _password = string.Empty; - private string _passwordtype = "password"; - private string _togglepassword = string.Empty; - private bool _remember = false; - private string _code = string.Empty; + private bool _allowsitelogin = true; + private bool _allowexternallogin = false; + private ElementReference login; + private bool validated = false; + private bool twofactor = false; + private string _username = string.Empty; + private ElementReference username; + private string _password = string.Empty; + private string _passwordtype = "password"; + private string _togglepassword = string.Empty; + private bool _remember = false; + private string _code = string.Empty; - private string _returnUrl = string.Empty; + private string _returnUrl = string.Empty; - public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Anonymous; + public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Anonymous; - public override List Resources => new List() + public override List Resources => new List() { new Resource { ResourceType = ResourceType.Stylesheet, Url = ModulePath() + "Module.css" } }; - protected override async Task OnInitializedAsync() - { - try - { - _togglepassword = SharedLocalizer["ShowPassword"]; + protected override async Task OnInitializedAsync() + { + try + { + _togglepassword = SharedLocalizer["ShowPassword"]; - if (PageState.Site.Settings.ContainsKey("LoginOptions:AllowSiteLogin") && !string.IsNullOrEmpty(PageState.Site.Settings["LoginOptions:AllowSiteLogin"])) - { - _allowsitelogin = bool.Parse(PageState.Site.Settings["LoginOptions:AllowSiteLogin"]); - } + if (PageState.Site.Settings.ContainsKey("LoginOptions:AllowSiteLogin") && !string.IsNullOrEmpty(PageState.Site.Settings["LoginOptions:AllowSiteLogin"])) + { + _allowsitelogin = bool.Parse(PageState.Site.Settings["LoginOptions:AllowSiteLogin"]); + } - if (PageState.Site.Settings.ContainsKey("ExternalLogin:ProviderType") && !string.IsNullOrEmpty(PageState.Site.Settings["ExternalLogin:ProviderType"])) - { - _allowexternallogin = true; - } + if (PageState.Site.Settings.ContainsKey("ExternalLogin:ProviderType") && !string.IsNullOrEmpty(PageState.Site.Settings["ExternalLogin:ProviderType"])) + { + _allowexternallogin = true; + } - if (PageState.QueryString.ContainsKey("returnurl")) - { - _returnUrl = PageState.QueryString["returnurl"]; - } + if (PageState.QueryString.ContainsKey("returnurl")) + { + _returnUrl = PageState.QueryString["returnurl"]; + } - if (PageState.QueryString.ContainsKey("name")) - { - _username = PageState.QueryString["name"]; - } + if (PageState.QueryString.ContainsKey("name")) + { + _username = PageState.QueryString["name"]; + } - if (PageState.QueryString.ContainsKey("token") && !string.IsNullOrEmpty(_username)) - { - var user = new User(); - user.SiteId = PageState.Site.SiteId; - user.Username = _username; + if (PageState.QueryString.ContainsKey("token") && !string.IsNullOrEmpty(_username)) + { + var user = new User(); + user.SiteId = PageState.Site.SiteId; + user.Username = _username; - if (PageState.QueryString.ContainsKey("key")) - { - user = await UserService.LinkUserAsync(user, PageState.QueryString["token"], PageState.Site.Settings["ExternalLogin:ProviderType"], PageState.QueryString["key"], PageState.Site.Settings["ExternalLogin:ProviderName"]); - if (user != null) - { - await logger.LogInformation(LogFunction.Security, "External Login Linkage Successful For Username {Username}", _username); - AddModuleMessage(Localizer["Success.Account.Linked"], MessageType.Info); - } - else - { - await logger.LogError(LogFunction.Security, "External Login Linkage Failed For Username {Username}", _username); - AddModuleMessage(Localizer["Message.Account.NotLinked"], MessageType.Warning); - } - _username = ""; - } - else - { - user = await UserService.VerifyEmailAsync(user, PageState.QueryString["token"]); - if (user != null) - { - await logger.LogInformation(LogFunction.Security, "Email Verified For For Username {Username}", _username); - AddModuleMessage(Localizer["Success.Account.Verified"], MessageType.Info); - } - else - { - await logger.LogError(LogFunction.Security, "Email Verification Failed For Username {Username}", _username); - AddModuleMessage(Localizer["Message.Account.NotVerified"], MessageType.Warning); - } - } - } - else - { - if (PageState.QueryString.ContainsKey("status")) - { - AddModuleMessage(Localizer["ExternalLoginStatus." + PageState.QueryString["status"]], MessageType.Info); - } - } - } - catch (Exception ex) - { - await logger.LogError(ex, "Error Loading Login {Error}", ex.Message); - AddModuleMessage(Localizer["Error.LoadLogin"], MessageType.Error); - } - } + if (PageState.QueryString.ContainsKey("key")) + { + user = await UserService.LinkUserAsync(user, PageState.QueryString["token"], PageState.Site.Settings["ExternalLogin:ProviderType"], PageState.QueryString["key"], PageState.Site.Settings["ExternalLogin:ProviderName"]); + if (user != null) + { + await logger.LogInformation(LogFunction.Security, "External Login Linkage Successful For Username {Username}", _username); + AddModuleMessage(Localizer["Success.Account.Linked"], MessageType.Info); + } + else + { + await logger.LogError(LogFunction.Security, "External Login Linkage Failed For Username {Username}", _username); + AddModuleMessage(Localizer["Message.Account.NotLinked"], MessageType.Warning); + } + _username = ""; + } + else + { + user = await UserService.VerifyEmailAsync(user, PageState.QueryString["token"]); + if (user != null) + { + await logger.LogInformation(LogFunction.Security, "Email Verified For For Username {Username}", _username); + AddModuleMessage(Localizer["Success.Account.Verified"], MessageType.Info); + } + else + { + await logger.LogError(LogFunction.Security, "Email Verification Failed For Username {Username}", _username); + AddModuleMessage(Localizer["Message.Account.NotVerified"], MessageType.Warning); + } + } + } + else + { + if (PageState.QueryString.ContainsKey("status")) + { + AddModuleMessage(Localizer["ExternalLoginStatus." + PageState.QueryString["status"]], MessageType.Info); + } + } + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Loading Login {Error}", ex.Message); + AddModuleMessage(Localizer["Error.LoadLogin"], MessageType.Error); + } + } - protected override async Task OnAfterRenderAsync(bool firstRender) - { - if (firstRender && PageState.User == null) - { - await username.FocusAsync(); - } - } + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (firstRender && PageState.User == null) + { + await username.FocusAsync(); + } - private async Task Login() - { - try - { - validated = true; - var interop = new Interop(JSRuntime); - if (await interop.FormValid(login)) - { - var hybrid = (PageState.Runtime == Shared.Runtime.Hybrid); - var user = new User { SiteId = PageState.Site.SiteId, Username = _username, Password = _password, LastIPAddress = SiteState.RemoteIPAddress}; - - if (!twofactor) - { - user = await UserService.LoginUserAsync(user, hybrid, _remember); - } - else - { - user = await UserService.VerifyTwoFactorAsync(user, _code); - } + // redirect logged in user to specified page + if (PageState.User != null) + { + NavigationManager.NavigateTo(PageState.ReturnUrl); + } + } - if (user.IsAuthenticated) - { - await logger.LogInformation(LogFunction.Security, "Login Successful For Username {Username}", _username); + private async Task Login() + { + try + { + validated = true; + var interop = new Interop(JSRuntime); + if (await interop.FormValid(login)) + { + var hybrid = (PageState.Runtime == Shared.Runtime.Hybrid); + var user = new User { SiteId = PageState.Site.SiteId, Username = _username, Password = _password, LastIPAddress = SiteState.RemoteIPAddress}; - if (hybrid) - { - // hybrid apps utilize an interactive login - var authstateprovider = (IdentityAuthenticationStateProvider)ServiceProvider - .GetService(typeof(IdentityAuthenticationStateProvider)); - authstateprovider.NotifyAuthenticationChanged(); - NavigationManager.NavigateTo(NavigateUrl(WebUtility.UrlDecode(_returnUrl), true)); - } - else - { - // post back to the Login page so that the cookies are set correctly - var fields = new { __RequestVerificationToken = SiteState.AntiForgeryToken, username = _username, password = _password, remember = _remember, returnurl = _returnUrl }; - string url = Utilities.TenantUrl(PageState.Alias, "/pages/login/"); - await interop.SubmitForm(url, fields); - } - } - else - { - if ((PageState.Site.Settings.ContainsKey("LoginOptions:TwoFactor") && PageState.Site.Settings["LoginOptions:TwoFactor"] == "required") || user.TwoFactorRequired) - { - twofactor = true; - validated = false; - AddModuleMessage(Localizer["Message.TwoFactor"], MessageType.Info); - } - else - { - if (!twofactor) - { - await logger.LogInformation(LogFunction.Security, "Login Failed For Username {Username}", _username); - AddModuleMessage(Localizer["Error.Login.Fail"], MessageType.Error); - } - else - { - await logger.LogInformation(LogFunction.Security, "Two Factor Verification Failed For Username {Username}", _username); - AddModuleMessage(Localizer["Error.TwoFactor.Fail"], MessageType.Error); - } - } - } - } - else - { - AddModuleMessage(Localizer["Message.Required.UserInfo"], MessageType.Warning); - } - } - catch (Exception ex) - { - await logger.LogError(ex, "Error Performing Login {Error}", ex.Message); - AddModuleMessage(Localizer["Error.Login"], MessageType.Error); - } - } + if (!twofactor) + { + user = await UserService.LoginUserAsync(user, hybrid, _remember); + } + else + { + user = await UserService.VerifyTwoFactorAsync(user, _code); + } - private void Cancel() - { - NavigationManager.NavigateTo(_returnUrl); - } + if (user.IsAuthenticated) + { + await logger.LogInformation(LogFunction.Security, "Login Successful For Username {Username}", _username); - private async Task Forgot() - { - try - { - if (_username != string.Empty) - { - var user = await UserService.GetUserAsync(_username, PageState.Site.SiteId); - if (user != null) - { - await UserService.ForgotPasswordAsync(user); - await logger.LogInformation(LogFunction.Security, "Password Reset Notification Sent For Username {Username}", _username); - AddModuleMessage(Localizer["Message.ForgotUser"], MessageType.Info); - } - else - { - AddModuleMessage(Localizer["Message.UserDoesNotExist"], MessageType.Warning); - } - } - else - { - AddModuleMessage(Localizer["Message.ForgotPassword"], MessageType.Info); - } + if (hybrid) + { + // hybrid apps utilize an interactive login + var authstateprovider = (IdentityAuthenticationStateProvider)ServiceProvider + .GetService(typeof(IdentityAuthenticationStateProvider)); + authstateprovider.NotifyAuthenticationChanged(); + NavigationManager.NavigateTo(NavigateUrl(WebUtility.UrlDecode(_returnUrl), true)); + } + else + { + // post back to the Login page so that the cookies are set correctly + var fields = new { __RequestVerificationToken = SiteState.AntiForgeryToken, username = _username, password = _password, remember = _remember, returnurl = _returnUrl }; + string url = Utilities.TenantUrl(PageState.Alias, "/pages/login/"); + await interop.SubmitForm(url, fields); + } + } + else + { + if ((PageState.Site.Settings.ContainsKey("LoginOptions:TwoFactor") && PageState.Site.Settings["LoginOptions:TwoFactor"] == "required") || user.TwoFactorRequired) + { + twofactor = true; + validated = false; + AddModuleMessage(Localizer["Message.TwoFactor"], MessageType.Info); + } + else + { + if (!twofactor) + { + await logger.LogInformation(LogFunction.Security, "Login Failed For Username {Username}", _username); + AddModuleMessage(Localizer["Error.Login.Fail"], MessageType.Error); + } + else + { + await logger.LogInformation(LogFunction.Security, "Two Factor Verification Failed For Username {Username}", _username); + AddModuleMessage(Localizer["Error.TwoFactor.Fail"], MessageType.Error); + } + } + } + } + else + { + AddModuleMessage(Localizer["Message.Required.UserInfo"], MessageType.Warning); + } + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Performing Login {Error}", ex.Message); + AddModuleMessage(Localizer["Error.Login"], MessageType.Error); + } + } - StateHasChanged(); - } - catch (Exception ex) - { - await logger.LogError(ex, "Error Resetting Password {Error}", ex.Message); - AddModuleMessage(Localizer["Error.ResetPassword"], MessageType.Error); - } - } + private void Cancel() + { + NavigationManager.NavigateTo(_returnUrl); + } - private void Reset() - { - twofactor = false; - _username = ""; - _password = ""; - ClearModuleMessage(); - StateHasChanged(); - } + private async Task Forgot() + { + try + { + if (_username != string.Empty) + { + var user = await UserService.GetUserAsync(_username, PageState.Site.SiteId); + if (user != null) + { + await UserService.ForgotPasswordAsync(user); + await logger.LogInformation(LogFunction.Security, "Password Reset Notification Sent For Username {Username}", _username); + AddModuleMessage(Localizer["Message.ForgotUser"], MessageType.Info); + } + else + { + AddModuleMessage(Localizer["Message.UserDoesNotExist"], MessageType.Warning); + } + } + else + { + AddModuleMessage(Localizer["Message.ForgotPassword"], MessageType.Info); + } - private async Task KeyPressed(KeyboardEventArgs e) - { - if (e.Code == "Enter" || e.Code == "NumpadEnter") - { - await Login(); - } - } + StateHasChanged(); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Resetting Password {Error}", ex.Message); + AddModuleMessage(Localizer["Error.ResetPassword"], MessageType.Error); + } + } - private void TogglePassword() - { - if (_passwordtype == "password") - { - _passwordtype = "text"; - _togglepassword = SharedLocalizer["HidePassword"]; - } - else - { - _passwordtype = "password"; - _togglepassword = SharedLocalizer["ShowPassword"]; - } - } + private void Reset() + { + twofactor = false; + _username = ""; + _password = ""; + ClearModuleMessage(); + StateHasChanged(); + } + + private async Task KeyPressed(KeyboardEventArgs e) + { + if (e.Code == "Enter" || e.Code == "NumpadEnter") + { + await Login(); + } + } - private void ExternalLogin() - { + private void TogglePassword() + { + if (_passwordtype == "password") + { + _passwordtype = "text"; + _togglepassword = SharedLocalizer["HidePassword"]; + } + else + { + _passwordtype = "password"; + _togglepassword = SharedLocalizer["ShowPassword"]; + } + } + + private void ExternalLogin() + { NavigationManager.NavigateTo(Utilities.TenantUrl(PageState.Alias, "/pages/external?returnurl=" + _returnUrl), true); - } + } } diff --git a/Oqtane.Server/Infrastructure/UpgradeManager.cs b/Oqtane.Server/Infrastructure/UpgradeManager.cs index c4d5e91ff..3af4b4b7f 100644 --- a/Oqtane.Server/Infrastructure/UpgradeManager.cs +++ b/Oqtane.Server/Infrastructure/UpgradeManager.cs @@ -231,7 +231,7 @@ private void Upgrade_3_1_4(Tenant tenant, IServiceScope scope) new Permission(PermissionNames.View, RoleNames.Admin, true), new Permission(PermissionNames.Edit, RoleNames.Admin, true) }, - Content = "

The page you requested does not exist.

" + Content = "

The page you requested does not exist or you do not have sufficient rights to view it.

" } } }); diff --git a/Oqtane.Server/Repository/SiteRepository.cs b/Oqtane.Server/Repository/SiteRepository.cs index e75738ae7..72e07bc7c 100644 --- a/Oqtane.Server/Repository/SiteRepository.cs +++ b/Oqtane.Server/Repository/SiteRepository.cs @@ -640,7 +640,7 @@ private List CreateAdminPages(List pageTemplates = n new Permission(PermissionNames.View, RoleNames.Admin, true), new Permission(PermissionNames.Edit, RoleNames.Admin, true) }, - Content = "

The page you requested does not exist.

" + Content = "

The page you requested does not exist or you do not have sufficient rights to view it.

" } } });