diff --git a/Oqtane.Client/Modules/Admin/Users/Index.razor b/Oqtane.Client/Modules/Admin/Users/Index.razor
index e0d895c8..a73350f0 100644
--- a/Oqtane.Client/Modules/Admin/Users/Index.razor
+++ b/Oqtane.Client/Modules/Admin/Users/Index.razor
@@ -421,6 +421,18 @@ else
+ @if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host))
+ {
+
+
+
+
+
+
+ }
}
@@ -520,6 +532,7 @@ else
private string _domainfilter;
private string _createusers;
private string _verifyusers;
+ private string _allowhostrole;
private string _secret;
private string _secrettype = "password";
@@ -602,6 +615,7 @@ else
_domainfilter = SettingService.GetSetting(settings, "ExternalLogin:DomainFilter", "");
_createusers = SettingService.GetSetting(settings, "ExternalLogin:CreateUsers", "true");
_verifyusers = SettingService.GetSetting(settings, "ExternalLogin:VerifyUsers", "true");
+ _allowhostrole = SettingService.GetSetting(settings, "ExternalLogin:AllowHostRole", "false");
}
private async Task LoadUsersAsync(bool load)
@@ -705,6 +719,7 @@ else
settings = SettingService.SetSetting(settings, "ExternalLogin:DomainFilter", _domainfilter, true);
settings = SettingService.SetSetting(settings, "ExternalLogin:CreateUsers", _createusers, true);
settings = SettingService.SetSetting(settings, "ExternalLogin:VerifyUsers", _verifyusers, true);
+ settings = SettingService.SetSetting(settings, "ExternalLogin:AllowHostRole", _allowhostrole, true);
settings = SettingService.SetSetting(settings, "JwtOptions:Secret", _secret, true);
settings = SettingService.SetSetting(settings, "JwtOptions:Issuer", _issuer, true);
diff --git a/Oqtane.Client/Resources/Modules/Admin/Users/Index.resx b/Oqtane.Client/Resources/Modules/Admin/Users/Index.resx
index 3b0bda17..a0a7c1f4 100644
--- a/Oqtane.Client/Resources/Modules/Admin/Users/Index.resx
+++ b/Oqtane.Client/Resources/Modules/Admin/Users/Index.resx
@@ -513,4 +513,10 @@
Do you want users to be logged out of every active session on any device, or only their current session?
+
+ Allow Host Role?
+
+
+ Indicate if host roles are supported from the identity provider. Please use caution with this option as it allows the host user to administrate every site within your installation.
+
\ No newline at end of file
diff --git a/Oqtane.Server/Extensions/OqtaneSiteAuthenticationBuilderExtensions.cs b/Oqtane.Server/Extensions/OqtaneSiteAuthenticationBuilderExtensions.cs
index 0e58e4b6..f0c7c455 100644
--- a/Oqtane.Server/Extensions/OqtaneSiteAuthenticationBuilderExtensions.cs
+++ b/Oqtane.Server/Extensions/OqtaneSiteAuthenticationBuilderExtensions.cs
@@ -532,8 +532,9 @@ namespace Oqtane.Extensions
// external roles
if (claimsPrincipal.Claims.Any(item => item.Type == httpContext.GetSiteSettings().GetValue("ExternalLogin:RoleClaimType", "")))
{
- var _roles = httpContext.RequestServices.GetRequiredService();
- var roles = _roles.GetRoles(user.SiteId).ToList(); // global roles excluded ie. host users cannot be added/deleted
+ var _roles = httpContext.RequestServices.GetRequiredService();
+ var allowhostrole = bool.Parse(httpContext.GetSiteSettings().GetValue("ExternalLogin:AllowHostRole", "false"));
+ var roles = _roles.GetRoles(user.SiteId, allowhostrole).ToList();
var mappings = httpContext.GetSiteSettings().GetValue("ExternalLogin:RoleClaimMappings", "").Split(',');
foreach (var claim in claimsPrincipal.Claims.Where(item => item.Type == httpContext.GetSiteSettings().GetValue("ExternalLogin:RoleClaimType", "")))