From e4c648ee922fdff422daeca1b24a70b6555a4293 Mon Sep 17 00:00:00 2001 From: Shaun Walker Date: Fri, 22 Apr 2022 17:54:20 -0400 Subject: [PATCH] completed antiforgery implementation, improved external login claim mapping, principal construction, and user experience --- .../Installer/Controls/MySQLConfig.razor | 2 +- .../Installer/Controls/PostgreSQLConfig.razor | 2 +- .../Installer/Controls/SqlServerConfig.razor | 2 +- Oqtane.Client/Installer/Installer.razor | 27 +- Oqtane.Client/Modules/Admin/Login/Index.razor | 28 +- .../Modules/Admin/Register/Index.razor | 49 +- Oqtane.Client/Modules/Admin/Reset/Index.razor | 28 +- Oqtane.Client/Modules/Admin/Site/Index.razor | 6 +- Oqtane.Client/Modules/Admin/Sites/Add.razor | 4 +- .../Modules/Admin/UserProfile/Index.razor | 16 +- Oqtane.Client/Modules/Admin/Users/Add.razor | 13 +- Oqtane.Client/Modules/Admin/Users/Edit.razor | 16 +- Oqtane.Client/Modules/Admin/Users/Index.razor | 585 +++++++++--------- .../Resources/Modules/Admin/Login/Index.resx | 12 +- .../Resources/Modules/Admin/Site/Index.resx | 6 - .../Modules/Admin/UserProfile/Index.resx | 6 - .../Resources/Modules/Admin/Users/Add.resx | 8 +- .../Resources/Modules/Admin/Users/Edit.resx | 8 +- .../Resources/Modules/Admin/Users/Index.resx | 35 +- Oqtane.Client/Resources/SharedResources.resx | 6 + .../Services/Interfaces/IUserService.cs | 4 +- Oqtane.Client/Services/RemoteServiceBase.cs | 9 +- Oqtane.Client/Services/UserService.cs | 4 +- .../Themes/Controls/Theme/LoginBase.cs | 23 +- Oqtane.Client/UI/SiteRouter.razor | 30 +- Oqtane.Server/Controllers/SqlController.cs | 1 + Oqtane.Server/Controllers/UserController.cs | 6 +- ...taneSiteAuthenticationBuilderExtensions.cs | 144 +++-- Oqtane.Server/Extensions/StringExtensions.cs | 9 + .../Middleware/JwtMiddleware.cs | 9 +- Oqtane.Server/Pages/External.cshtml.cs | 22 +- Oqtane.Server/Pages/Login.cshtml.cs | 4 +- Oqtane.Server/Pages/Logout.cshtml.cs | 5 +- .../Repository/ModuleDefinitionRepository.cs | 4 +- Oqtane.Server/Startup.cs | 2 +- Oqtane.Shared/Enums/ExternalLoginStatus.cs | 13 - Oqtane.Shared/Security/UserSecurity.cs | 9 - Oqtane.Shared/Shared/ExternalLoginStatus.cs | 13 + 38 files changed, 645 insertions(+), 525 deletions(-) delete mode 100644 Oqtane.Shared/Enums/ExternalLoginStatus.cs create mode 100644 Oqtane.Shared/Shared/ExternalLoginStatus.cs diff --git a/Oqtane.Client/Installer/Controls/MySQLConfig.razor b/Oqtane.Client/Installer/Controls/MySQLConfig.razor index 7de576b0..735285d4 100644 --- a/Oqtane.Client/Installer/Controls/MySQLConfig.razor +++ b/Oqtane.Client/Installer/Controls/MySQLConfig.razor @@ -28,7 +28,7 @@
- +
diff --git a/Oqtane.Client/Installer/Controls/PostgreSQLConfig.razor b/Oqtane.Client/Installer/Controls/PostgreSQLConfig.razor index d3ff4eca..652e55dc 100644 --- a/Oqtane.Client/Installer/Controls/PostgreSQLConfig.razor +++ b/Oqtane.Client/Installer/Controls/PostgreSQLConfig.razor @@ -40,7 +40,7 @@
- +
} diff --git a/Oqtane.Client/Installer/Controls/SqlServerConfig.razor b/Oqtane.Client/Installer/Controls/SqlServerConfig.razor index 021ba776..12c4b981 100644 --- a/Oqtane.Client/Installer/Controls/SqlServerConfig.razor +++ b/Oqtane.Client/Installer/Controls/SqlServerConfig.razor @@ -35,7 +35,7 @@
- +
} diff --git a/Oqtane.Client/Installer/Installer.razor b/Oqtane.Client/Installer/Installer.razor index fc404d7f..5630b592 100644 --- a/Oqtane.Client/Installer/Installer.razor +++ b/Oqtane.Client/Installer/Installer.razor @@ -62,13 +62,19 @@
- +
+ + +
- +
+ + +
@@ -104,6 +110,8 @@ private string _hostUsername = string.Empty; private string _hostPassword = string.Empty; + private string _passwordtype = "password"; + private string _togglepassword = string.Empty; private string _confirmPassword = string.Empty; private string _hostEmail = string.Empty; private bool _register = true; @@ -112,6 +120,7 @@ protected override async Task OnInitializedAsync() { + _togglepassword = SharedLocalizer["ShowPassword"]; _databases = await DatabaseService.GetDatabasesAsync(); if (_databases.Exists(item => item.IsDefault)) { @@ -218,4 +227,18 @@ _message = Localizer["Message.Require.DbInfo"]; } } + + private void TogglePassword() + { + if (_passwordtype == "password") + { + _passwordtype = "text"; + _togglepassword = SharedLocalizer["HidePassword"]; + } + else + { + _passwordtype = "password"; + _togglepassword = SharedLocalizer["ShowPassword"]; + } + } } diff --git a/Oqtane.Client/Modules/Admin/Login/Index.razor b/Oqtane.Client/Modules/Admin/Login/Index.razor index c8e61d38..6b4d02e1 100644 --- a/Oqtane.Client/Modules/Admin/Login/Index.razor +++ b/Oqtane.Client/Modules/Admin/Login/Index.razor @@ -95,7 +95,7 @@ { try { - _togglepassword = Localizer["ShowPassword"]; + _togglepassword = SharedLocalizer["ShowPassword"]; if (PageState.Site.Settings.ContainsKey("LoginOptions:AllowSiteLogin") && !string.IsNullOrEmpty(PageState.Site.Settings["LoginOptions:AllowSiteLogin"])) { @@ -188,8 +188,7 @@ if (!twofactor) { - bool setCookie = (PageState.Runtime == Oqtane.Shared.Runtime.WebAssembly); - user = await UserService.LoginUserAsync(user, setCookie, false); + user = await UserService.LoginUserAsync(user); } else { @@ -200,23 +199,14 @@ { await logger.LogInformation(LogFunction.Security, "Login Successful For Username {Username}", _username); - if (PageState.Runtime == Oqtane.Shared.Runtime.Server) - { - // server-side Blazor needs to post 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 - { - var authstateprovider = (IdentityAuthenticationStateProvider)ServiceProvider.GetService(typeof(IdentityAuthenticationStateProvider)); - authstateprovider.NotifyAuthenticationChanged(); - NavigationManager.NavigateTo(NavigateUrl(_returnUrl, true)); - } + // 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 (user.TwoFactorRequired) + if (PageState.Site.Settings["LoginOptions:TwoFactor"] == "required" || user.TwoFactorRequired) { twofactor = true; validated = false; @@ -308,12 +298,12 @@ if (_passwordtype == "password") { _passwordtype = "text"; - _togglepassword = Localizer["HidePassword"]; + _togglepassword = SharedLocalizer["HidePassword"]; } else { _passwordtype = "password"; - _togglepassword = Localizer["ShowPassword"]; + _togglepassword = SharedLocalizer["ShowPassword"]; } } diff --git a/Oqtane.Client/Modules/Admin/Register/Index.razor b/Oqtane.Client/Modules/Admin/Register/Index.razor index 66ec29e5..24ca61b5 100644 --- a/Oqtane.Client/Modules/Admin/Register/Index.razor +++ b/Oqtane.Client/Modules/Admin/Register/Index.razor @@ -27,19 +27,25 @@
- +
+ + +
- +
+ + +
- +
@@ -62,15 +68,22 @@ else } @code { - private string _username = string.Empty; - private ElementReference form; - private bool validated = false; - private string _password = string.Empty; - private string _confirm = string.Empty; - private string _email = string.Empty; - private string _displayname = string.Empty; + private string _username = string.Empty; + private ElementReference form; + private bool validated = false; + private string _password = string.Empty; + private string _passwordtype = "password"; + private string _togglepassword = string.Empty; + private string _confirm = string.Empty; + private string _email = string.Empty; + private string _displayname = string.Empty; - public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Anonymous; + public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Anonymous; + + protected override void OnParametersSet() + { + _togglepassword = SharedLocalizer["ShowPassword"]; + } private async Task Register() { @@ -134,4 +147,18 @@ else { NavigationManager.NavigateTo(NavigateUrl(string.Empty)); } + + private void TogglePassword() + { + if (_passwordtype == "password") + { + _passwordtype = "text"; + _togglepassword = SharedLocalizer["HidePassword"]; + } + else + { + _passwordtype = "password"; + _togglepassword = SharedLocalizer["ShowPassword"]; + } + } } diff --git a/Oqtane.Client/Modules/Admin/Reset/Index.razor b/Oqtane.Client/Modules/Admin/Reset/Index.razor index 00eac54d..07556105 100644 --- a/Oqtane.Client/Modules/Admin/Reset/Index.razor +++ b/Oqtane.Client/Modules/Admin/Reset/Index.razor @@ -16,13 +16,19 @@
- +
+ + +
- +
+ + +
@@ -36,12 +42,16 @@ private bool validated = false; private string _username = string.Empty; private string _password = string.Empty; + private string _passwordtype = "password"; + private string _togglepassword = string.Empty; private string _confirm = string.Empty; public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Anonymous; protected override async Task OnInitializedAsync() { + _togglepassword = SharedLocalizer["ShowPassword"]; + if (PageState.QueryString.ContainsKey("name") && PageState.QueryString.ContainsKey("token")) { _username = PageState.QueryString["name"]; @@ -110,4 +120,18 @@ { NavigationManager.NavigateTo(NavigateUrl(string.Empty)); } + + private void TogglePassword() + { + if (_passwordtype == "password") + { + _passwordtype = "text"; + _togglepassword = SharedLocalizer["HidePassword"]; + } + else + { + _passwordtype = "password"; + _togglepassword = SharedLocalizer["ShowPassword"]; + } + } } diff --git a/Oqtane.Client/Modules/Admin/Site/Index.razor b/Oqtane.Client/Modules/Admin/Site/Index.razor index ab85d405..3d0ce023 100644 --- a/Oqtane.Client/Modules/Admin/Site/Index.razor +++ b/Oqtane.Client/Modules/Admin/Site/Index.razor @@ -341,7 +341,7 @@ _smtpssl = SettingService.GetSetting(settings, "SMTPSSL", "False"); _smtpusername = SettingService.GetSetting(settings, "SMTPUsername", string.Empty); _smtppassword = SettingService.GetSetting(settings, "SMTPPassword", string.Empty); - _togglesmtppassword = Localizer["Show"]; + _togglesmtppassword = SharedLocalizer["ShowPassword"]; _smtpsender = SettingService.GetSetting(settings, "SMTPSender", string.Empty); _retention = SettingService.GetSetting(settings, "NotificationRetention", "30"); @@ -656,12 +656,12 @@ if (_smtppasswordtype == "password") { _smtppasswordtype = "text"; - _togglesmtppassword = Localizer["Hide"]; + _togglesmtppassword = SharedLocalizer["HidePassword"]; } else { _smtppasswordtype = "password"; - _togglesmtppassword = Localizer["Show"]; + _togglesmtppassword = SharedLocalizer["ShowPassword"]; } } } diff --git a/Oqtane.Client/Modules/Admin/Sites/Add.razor b/Oqtane.Client/Modules/Admin/Sites/Add.razor index 14cbc5f0..7f1e12bd 100644 --- a/Oqtane.Client/Modules/Admin/Sites/Add.razor +++ b/Oqtane.Client/Modules/Admin/Sites/Add.razor @@ -156,7 +156,7 @@ else
- +
} @@ -307,7 +307,7 @@ else user.SiteId = PageState.Site.SiteId; user.Username = _hostusername; user.Password = _hostpassword; - user = await UserService.LoginUserAsync(user, false, false); + user = await UserService.LoginUserAsync(user); if (user.IsAuthenticated) { var connectionString = String.Empty; diff --git a/Oqtane.Client/Modules/Admin/UserProfile/Index.razor b/Oqtane.Client/Modules/Admin/UserProfile/Index.razor index 2caf9be8..a2aeb314 100644 --- a/Oqtane.Client/Modules/Admin/UserProfile/Index.razor +++ b/Oqtane.Client/Modules/Admin/UserProfile/Index.razor @@ -33,7 +33,7 @@ else
- +
@@ -41,7 +41,10 @@ else
- +
+ + +
@if (allowtwofactor) @@ -246,10 +249,11 @@ else { try { - _togglepassword = Localizer["ShowPassword"]; + _togglepassword = SharedLocalizer["ShowPassword"]; + if (PageState.Site.Settings.ContainsKey("LoginOptions:TwoFactor") && !string.IsNullOrEmpty(PageState.Site.Settings["LoginOptions:TwoFactor"])) { - allowtwofactor = bool.Parse(PageState.Site.Settings["LoginOptions:TwoFactor"]); + allowtwofactor = (PageState.Site.Settings["LoginOptions:TwoFactor"] == "true"); } if (PageState.User != null) @@ -455,12 +459,12 @@ else if (_passwordtype == "password") { _passwordtype = "text"; - _togglepassword = Localizer["HidePassword"]; + _togglepassword = SharedLocalizer["HidePassword"]; } else { _passwordtype = "password"; - _togglepassword = Localizer["ShowPassword"]; + _togglepassword = SharedLocalizer["ShowPassword"]; } } diff --git a/Oqtane.Client/Modules/Admin/Users/Add.razor b/Oqtane.Client/Modules/Admin/Users/Add.razor index 5fc0d465..ee0fdc8e 100644 --- a/Oqtane.Client/Modules/Admin/Users/Add.razor +++ b/Oqtane.Client/Modules/Admin/Users/Add.razor @@ -22,7 +22,7 @@
- +
@@ -30,7 +30,10 @@
- +
+ + +
@@ -107,7 +110,7 @@ { try { - _togglepassword = Localizer["ShowPassword"]; + _togglepassword = SharedLocalizer["ShowPassword"]; profiles = await ProfileService.GetProfilesAsync(ModuleState.SiteId); settings = new Dictionary(); } @@ -204,12 +207,12 @@ if (_passwordtype == "password") { _passwordtype = "text"; - _togglepassword = Localizer["HidePassword"]; + _togglepassword = SharedLocalizer["HidePassword"]; } else { _passwordtype = "password"; - _togglepassword = Localizer["ShowPassword"]; + _togglepassword = SharedLocalizer["ShowPassword"]; } } } diff --git a/Oqtane.Client/Modules/Admin/Users/Edit.razor b/Oqtane.Client/Modules/Admin/Users/Edit.razor index b2445c4c..fa05cc6e 100644 --- a/Oqtane.Client/Modules/Admin/Users/Edit.razor +++ b/Oqtane.Client/Modules/Admin/Users/Edit.razor @@ -31,7 +31,7 @@ else
- +
@@ -39,7 +39,10 @@ else
- +
+ + +
@@ -162,10 +165,9 @@ else { try { - // OnParametersSetAsync is called when the edit modal is closed - in which case there is no id parameter if (PageState.QueryString.ContainsKey("id")) { - _togglepassword = Localizer["ShowPassword"]; + _togglepassword = SharedLocalizer["ShowPassword"]; profiles = await ProfileService.GetProfilesAsync(PageState.Site.SiteId); userid = Int32.Parse(PageState.QueryString["id"]); var user = await UserService.GetUserAsync(userid, PageState.Site.SiteId); @@ -274,17 +276,17 @@ else settings = SettingService.SetSetting(settings, SettingName, value); } - private void TogglePassword() + private void TogglePassword() { if (_passwordtype == "password") { _passwordtype = "text"; - _togglepassword = Localizer["HidePassword"]; + _togglepassword = SharedLocalizer["HidePassword"]; } else { _passwordtype = "password"; - _togglepassword = Localizer["ShowPassword"]; + _togglepassword = SharedLocalizer["ShowPassword"]; } } } diff --git a/Oqtane.Client/Modules/Admin/Users/Index.razor b/Oqtane.Client/Modules/Admin/Users/Index.razor index 50fc9d3f..d2c59065 100644 --- a/Oqtane.Client/Modules/Admin/Users/Index.razor +++ b/Oqtane.Client/Modules/Admin/Users/Index.razor @@ -94,250 +94,254 @@ else
} -
- -
- -
-
- @if (!string.IsNullOrEmpty(PageState.Alias.Path)) + @if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host)) {
- +
- + + +
+
+ +
+ +
+
} -
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
-
-
- -
- -
-
-
- -
- -
-
-
-
-
- -
- -
-
- @if (_providertype != "") - { + @if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host)) + { +
- +
- +
-
- } - @if (_providertype == AuthenticationProviderTypes.OpenIDConnect) - { +
- +
- +
-
+
- +
- -
-
- } - @if (_providertype == AuthenticationProviderTypes.OAuth2) - { -
- -
- -
-
-
- -
- -
-
-
- -
- -
-
- } - @if (_providertype != "") - { -
- -
- -
-
-
- -
-
- - -
-
-
-
- -
- -
-
-
- -
-
- +
- +
-
- @if (_providertype == AuthenticationProviderTypes.OpenIDConnect) - { -
- -
- -
-
- } +
- +
- -
-
-
- -
-
- } - -
-
- -
-
- - +
+ +
+
-
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
-
- - +
+
+
+
+ +
+
-
- -
+ +
+ +
+ +
+
+ +
+
+ +
+ +
+
+ @if (_providertype != "") + { +
+ +
+ +
+
+ } + @if (_providertype == AuthenticationProviderTypes.OpenIDConnect) + { +
+ +
+ +
+
+
+ +
+ +
+
+ } + @if (_providertype == AuthenticationProviderTypes.OAuth2) + { +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ } + @if (_providertype != "") + { +
+ +
+ +
+
+
+ +
+
+ + +
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ } +
+
+
+ +
+
+ + +
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+
+ + +
+
+
+
+ }
@@ -353,7 +357,7 @@ else private string _allowregistration; private string _allowsitelogin; private string _twofactor; - private string _cookietype; + private string _cookiename; private string _minimumlength; private string _uniquecharacters; @@ -378,6 +382,7 @@ else private string _scopes; private string _pkce; private string _redirecturl; + private string _identifierclaimtype; private string _emailclaimtype; private string _domainfilter; private string _createusers; @@ -401,41 +406,45 @@ else var settings = await SettingService.GetSiteSettingsAsync(PageState.Site.SiteId); _allowregistration = PageState.Site.AllowRegistration.ToString(); _allowsitelogin = SettingService.GetSetting(settings, "LoginOptions:AllowSiteLogin", "true"); - _twofactor = SettingService.GetSetting(settings, "LoginOptions:TwoFactor", "false"); - _cookietype = SettingService.GetSetting(settings, "LoginOptions:CookieType", "domain"); - _minimumlength = SettingService.GetSetting(settings, "IdentityOptions:Password:RequiredLength", "6"); - _uniquecharacters = SettingService.GetSetting(settings, "IdentityOptions:Password:RequiredUniqueChars", "1"); - _requiredigit = SettingService.GetSetting(settings, "IdentityOptions:Password:RequireDigit", "true"); - _requireupper = SettingService.GetSetting(settings, "IdentityOptions:Password:RequireUppercase", "true"); - _requirelower = SettingService.GetSetting(settings, "IdentityOptions:Password:RequireLowercase", "true"); - _requirepunctuation = SettingService.GetSetting(settings, "IdentityOptions:Password:RequireNonAlphanumeric", "true"); + if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host)) + { + _twofactor = SettingService.GetSetting(settings, "LoginOptions:TwoFactor", "false"); + _cookiename = SettingService.GetSetting(settings, "LoginOptions:CookieName", ".AspNetCore.Identity.Application"); - _maximumfailures = SettingService.GetSetting(settings, "IdentityOptions:Lockout:MaxFailedAccessAttempts", "5"); - _lockoutduration = TimeSpan.Parse(SettingService.GetSetting(settings, "IdentityOptions:Lockout:DefaultLockoutTimeSpan", "00:05:00")).TotalMinutes.ToString(); + _minimumlength = SettingService.GetSetting(settings, "IdentityOptions:Password:RequiredLength", "6"); + _uniquecharacters = SettingService.GetSetting(settings, "IdentityOptions:Password:RequiredUniqueChars", "1"); + _requiredigit = SettingService.GetSetting(settings, "IdentityOptions:Password:RequireDigit", "true"); + _requireupper = SettingService.GetSetting(settings, "IdentityOptions:Password:RequireUppercase", "true"); + _requirelower = SettingService.GetSetting(settings, "IdentityOptions:Password:RequireLowercase", "true"); + _requirepunctuation = SettingService.GetSetting(settings, "IdentityOptions:Password:RequireNonAlphanumeric", "true"); - _providertype = SettingService.GetSetting(settings, "ExternalLogin:ProviderType", ""); - _providername = SettingService.GetSetting(settings, "ExternalLogin:ProviderName", ""); - _authority = SettingService.GetSetting(settings, "ExternalLogin:Authority", ""); - _metadataurl = SettingService.GetSetting(settings, "ExternalLogin:MetadataUrl", ""); - _authorizationurl = SettingService.GetSetting(settings, "ExternalLogin:AuthorizationUrl", ""); - _tokenurl = SettingService.GetSetting(settings, "ExternalLogin:TokenUrl", ""); - _userinfourl = SettingService.GetSetting(settings, "ExternalLogin:UserInfoUrl", ""); - _clientid = SettingService.GetSetting(settings, "ExternalLogin:ClientId", ""); - _clientsecret = SettingService.GetSetting(settings, "ExternalLogin:ClientSecret", ""); - _toggleclientsecret = Localizer["Show"]; - _scopes = SettingService.GetSetting(settings, "ExternalLogin:Scopes", ""); - _pkce = SettingService.GetSetting(settings, "ExternalLogin:PKCE", "false"); - _redirecturl = PageState.Uri.Scheme + "://" + PageState.Alias.Name + "/signin-" + _providertype; - _emailclaimtype = SettingService.GetSetting(settings, "ExternalLogin:EmailClaimType", "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"); - _domainfilter = SettingService.GetSetting(settings, "ExternalLogin:DomainFilter", ""); - _createusers = SettingService.GetSetting(settings, "ExternalLogin:CreateUsers", "true"); + _maximumfailures = SettingService.GetSetting(settings, "IdentityOptions:Lockout:MaxFailedAccessAttempts", "5"); + _lockoutduration = TimeSpan.Parse(SettingService.GetSetting(settings, "IdentityOptions:Lockout:DefaultLockoutTimeSpan", "00:05:00")).TotalMinutes.ToString(); - _secret = SettingService.GetSetting(settings, "JwtOptions:Secret", ""); - _togglesecret = Localizer["Show"]; - _issuer = SettingService.GetSetting(settings, "JwtOptions:Issuer", PageState.Uri.Scheme + "://" + PageState.Alias.Name); - _audience = SettingService.GetSetting(settings, "JwtOptions:Audience", ""); - _lifetime = SettingService.GetSetting(settings, "JwtOptions:Lifetime", "20"); + _providertype = SettingService.GetSetting(settings, "ExternalLogin:ProviderType", ""); + _providername = SettingService.GetSetting(settings, "ExternalLogin:ProviderName", ""); + _authority = SettingService.GetSetting(settings, "ExternalLogin:Authority", ""); + _metadataurl = SettingService.GetSetting(settings, "ExternalLogin:MetadataUrl", ""); + _authorizationurl = SettingService.GetSetting(settings, "ExternalLogin:AuthorizationUrl", ""); + _tokenurl = SettingService.GetSetting(settings, "ExternalLogin:TokenUrl", ""); + _userinfourl = SettingService.GetSetting(settings, "ExternalLogin:UserInfoUrl", ""); + _clientid = SettingService.GetSetting(settings, "ExternalLogin:ClientId", ""); + _clientsecret = SettingService.GetSetting(settings, "ExternalLogin:ClientSecret", ""); + _toggleclientsecret = SharedLocalizer["ShowPassword"]; + _scopes = SettingService.GetSetting(settings, "ExternalLogin:Scopes", ""); + _pkce = SettingService.GetSetting(settings, "ExternalLogin:PKCE", "false"); + _redirecturl = PageState.Uri.Scheme + "://" + PageState.Alias.Name + "/signin-" + _providertype; + _identifierclaimtype = SettingService.GetSetting(settings, "ExternalLogin:IdentifierClaimType", "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier"); + _emailclaimtype = SettingService.GetSetting(settings, "ExternalLogin:EmailClaimType", "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"); + _domainfilter = SettingService.GetSetting(settings, "ExternalLogin:DomainFilter", ""); + _createusers = SettingService.GetSetting(settings, "ExternalLogin:CreateUsers", "true"); + + _secret = SettingService.GetSetting(settings, "JwtOptions:Secret", ""); + _togglesecret = SharedLocalizer["ShowPassword"]; + _issuer = SettingService.GetSetting(settings, "JwtOptions:Issuer", PageState.Uri.Scheme + "://" + PageState.Alias.Name); + _audience = SettingService.GetSetting(settings, "JwtOptions:Audience", ""); + _lifetime = SettingService.GetSetting(settings, "JwtOptions:Lifetime", "20"); } } private List Search(string search) @@ -507,39 +516,44 @@ else var settings = await SettingService.GetSiteSettingsAsync(site.SiteId); settings = SettingService.SetSetting(settings, "LoginOptions:AllowSiteLogin", _allowsitelogin, false); - settings = SettingService.SetSetting(settings, "LoginOptions:TwoFactor", _twofactor, false); - settings = SettingService.SetSetting(settings, "LoginOptions:CookieType", _cookietype, true); - settings = SettingService.SetSetting(settings, "IdentityOptions:Password:RequiredLength", _minimumlength, true); - settings = SettingService.SetSetting(settings, "IdentityOptions:Password:RequiredUniqueChars", _uniquecharacters, true); - settings = SettingService.SetSetting(settings, "IdentityOptions:Password:RequireDigit", _requiredigit, true); - settings = SettingService.SetSetting(settings, "IdentityOptions:Password:RequireUppercase", _requireupper, true); - settings = SettingService.SetSetting(settings, "IdentityOptions:Password:RequireLowercase", _requirelower, true); - settings = SettingService.SetSetting(settings, "IdentityOptions:Password:RequireNonAlphanumeric", _requirepunctuation, true); + if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host)) + { + settings = SettingService.SetSetting(settings, "LoginOptions:TwoFactor", _twofactor, false); + settings = SettingService.SetSetting(settings, "LoginOptions:CookieName", _cookiename, true); - settings = SettingService.SetSetting(settings, "IdentityOptions:Lockout:MaxFailedAccessAttempts", _maximumfailures, true); - settings = SettingService.SetSetting(settings, "IdentityOptions:Lockout:DefaultLockoutTimeSpan", TimeSpan.FromMinutes(Convert.ToInt64(_lockoutduration)).ToString(), true); + settings = SettingService.SetSetting(settings, "IdentityOptions:Password:RequiredLength", _minimumlength, true); + settings = SettingService.SetSetting(settings, "IdentityOptions:Password:RequiredUniqueChars", _uniquecharacters, true); + settings = SettingService.SetSetting(settings, "IdentityOptions:Password:RequireDigit", _requiredigit, true); + settings = SettingService.SetSetting(settings, "IdentityOptions:Password:RequireUppercase", _requireupper, true); + settings = SettingService.SetSetting(settings, "IdentityOptions:Password:RequireLowercase", _requirelower, true); + settings = SettingService.SetSetting(settings, "IdentityOptions:Password:RequireNonAlphanumeric", _requirepunctuation, true); - settings = SettingService.SetSetting(settings, "ExternalLogin:ProviderType", _providertype, false); - settings = SettingService.SetSetting(settings, "ExternalLogin:ProviderName", _providername, false); - settings = SettingService.SetSetting(settings, "ExternalLogin:Authority", _authority, true); - settings = SettingService.SetSetting(settings, "ExternalLogin:MetadataUrl", _metadataurl, true); - settings = SettingService.SetSetting(settings, "ExternalLogin:AuthorizationUrl", _authorizationurl, true); - settings = SettingService.SetSetting(settings, "ExternalLogin:TokenUrl", _tokenurl, true); - settings = SettingService.SetSetting(settings, "ExternalLogin:UserInfoUrl", _userinfourl, true); - settings = SettingService.SetSetting(settings, "ExternalLogin:ClientId", _clientid, true); - settings = SettingService.SetSetting(settings, "ExternalLogin:ClientSecret", _clientsecret, true); - settings = SettingService.SetSetting(settings, "ExternalLogin:Scopes", _scopes, true); - settings = SettingService.SetSetting(settings, "ExternalLogin:PKCE", _pkce, true); - settings = SettingService.SetSetting(settings, "ExternalLogin:EmailClaimType", _emailclaimtype, true); - settings = SettingService.SetSetting(settings, "ExternalLogin:DomainFilter", _domainfilter, true); - settings = SettingService.SetSetting(settings, "ExternalLogin:CreateUsers", _createusers, true); + settings = SettingService.SetSetting(settings, "IdentityOptions:Lockout:MaxFailedAccessAttempts", _maximumfailures, true); + settings = SettingService.SetSetting(settings, "IdentityOptions:Lockout:DefaultLockoutTimeSpan", TimeSpan.FromMinutes(Convert.ToInt64(_lockoutduration)).ToString(), true); - if (!string.IsNullOrEmpty(_secret) && _secret.Length < 16) _secret = (_secret + "????????????????").Substring(0, 16); - settings = SettingService.SetSetting(settings, "JwtOptions:Secret", _secret, true); - settings = SettingService.SetSetting(settings, "JwtOptions:Issuer", _issuer, true); - settings = SettingService.SetSetting(settings, "JwtOptions:Audience", _audience, true); - settings = SettingService.SetSetting(settings, "JwtOptions:Lifetime", _lifetime, true); + settings = SettingService.SetSetting(settings, "ExternalLogin:ProviderType", _providertype, false); + settings = SettingService.SetSetting(settings, "ExternalLogin:ProviderName", _providername, false); + settings = SettingService.SetSetting(settings, "ExternalLogin:Authority", _authority, true); + settings = SettingService.SetSetting(settings, "ExternalLogin:MetadataUrl", _metadataurl, true); + settings = SettingService.SetSetting(settings, "ExternalLogin:AuthorizationUrl", _authorizationurl, true); + settings = SettingService.SetSetting(settings, "ExternalLogin:TokenUrl", _tokenurl, true); + settings = SettingService.SetSetting(settings, "ExternalLogin:UserInfoUrl", _userinfourl, true); + settings = SettingService.SetSetting(settings, "ExternalLogin:ClientId", _clientid, true); + settings = SettingService.SetSetting(settings, "ExternalLogin:ClientSecret", _clientsecret, true); + settings = SettingService.SetSetting(settings, "ExternalLogin:Scopes", _scopes, true); + settings = SettingService.SetSetting(settings, "ExternalLogin:PKCE", _pkce, true); + settings = SettingService.SetSetting(settings, "ExternalLogin:IdentifierClaimType", _identifierclaimtype, true); + settings = SettingService.SetSetting(settings, "ExternalLogin:EmailClaimType", _emailclaimtype, true); + settings = SettingService.SetSetting(settings, "ExternalLogin:DomainFilter", _domainfilter, true); + settings = SettingService.SetSetting(settings, "ExternalLogin:CreateUsers", _createusers, true); + + if (!string.IsNullOrEmpty(_secret) && _secret.Length < 16) _secret = (_secret + "????????????????").Substring(0, 16); + settings = SettingService.SetSetting(settings, "JwtOptions:Secret", _secret, true); + settings = SettingService.SetSetting(settings, "JwtOptions:Issuer", _issuer, true); + settings = SettingService.SetSetting(settings, "JwtOptions:Audience", _audience, true); + settings = SettingService.SetSetting(settings, "JwtOptions:Lifetime", _lifetime, true); + } await SettingService.UpdateSiteSettingsAsync(settings, site.SiteId); await SettingService.ClearSiteSettingsCacheAsync(); @@ -561,13 +575,20 @@ else private void ProviderTypeChanged(ChangeEventArgs e) { _providertype = (string)e.Value; - if (_providertype == AuthenticationProviderTypes.OpenIDConnect) + if (string.IsNullOrEmpty(_providername)) { - _scopes = "openid,profile,email"; - } - else - { - _scopes = ""; + if (_providertype == AuthenticationProviderTypes.OpenIDConnect) + { + _scopes = "openid,profile,email"; + _identifierclaimtype = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier"; + _emailclaimtype = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"; + } + else + { + _scopes = ""; + _identifierclaimtype = "sub"; + _emailclaimtype = "email"; + } } _redirecturl = PageState.Uri.Scheme + "://" + PageState.Alias.Name + "/signin-" + _providertype; StateHasChanged(); @@ -583,12 +604,12 @@ else if (_clientsecrettype == "password") { _clientsecrettype = "text"; - _toggleclientsecret = Localizer["Hide"]; + _toggleclientsecret = SharedLocalizer["HidePassword"]; } else { _clientsecrettype = "password"; - _toggleclientsecret = Localizer["Show"]; + _toggleclientsecret = SharedLocalizer["ShowPassword"]; } } @@ -597,12 +618,12 @@ else if (_secrettype == "password") { _secrettype = "text"; - _togglesecret = Localizer["Hide"]; + _togglesecret = SharedLocalizer["HidePassword"]; } else { _secrettype = "password"; - _togglesecret = Localizer["Show"]; + _togglesecret = SharedLocalizer["ShowPassword"]; } } } diff --git a/Oqtane.Client/Resources/Modules/Admin/Login/Index.resx b/Oqtane.Client/Resources/Modules/Admin/Login/Index.resx index af56fc05..67dbbfed 100644 --- a/Oqtane.Client/Resources/Modules/Admin/Login/Index.resx +++ b/Oqtane.Client/Resources/Modules/Admin/Login/Index.resx @@ -189,12 +189,6 @@ Username: - - Hide - - - Show - Use @@ -225,4 +219,10 @@ In Order To Link Your External Login With Your User Account You Must Verify Your Identity. Please Check Your Email For Further Instructions. + + Your External Login Was Denied Access. Please Contact Your Administrator For Further Instructions. + + + Your External Login Failed. Please Contact Your Administrator For Further Instructions. + \ No newline at end of file diff --git a/Oqtane.Client/Resources/Modules/Admin/Site/Index.resx b/Oqtane.Client/Resources/Modules/Admin/Site/Index.resx index c20813b4..1007685f 100644 --- a/Oqtane.Client/Resources/Modules/Admin/Site/Index.resx +++ b/Oqtane.Client/Resources/Modules/Admin/Site/Index.resx @@ -324,10 +324,4 @@ Aliases - - Hide - - - Show - \ No newline at end of file diff --git a/Oqtane.Client/Resources/Modules/Admin/UserProfile/Index.resx b/Oqtane.Client/Resources/Modules/Admin/UserProfile/Index.resx index eccd3c38..6eabb548 100644 --- a/Oqtane.Client/Resources/Modules/Admin/UserProfile/Index.resx +++ b/Oqtane.Client/Resources/Modules/Admin/UserProfile/Index.resx @@ -219,10 +219,4 @@ Delete ALL Notifications - - Hide - - - Show - \ No newline at end of file diff --git a/Oqtane.Client/Resources/Modules/Admin/Users/Add.resx b/Oqtane.Client/Resources/Modules/Admin/Users/Add.resx index 37bf3f31..810f2b9d 100644 --- a/Oqtane.Client/Resources/Modules/Admin/Users/Add.resx +++ b/Oqtane.Client/Resources/Modules/Admin/Users/Add.resx @@ -1,4 +1,4 @@ - +