diff --git a/src/Umbraco.Core/Services/IUserIdKeyResolver.cs b/src/Umbraco.Core/Services/IUserIdKeyResolver.cs
index aec8e38db3fb..01e8523fb971 100644
--- a/src/Umbraco.Core/Services/IUserIdKeyResolver.cs
+++ b/src/Umbraco.Core/Services/IUserIdKeyResolver.cs
@@ -1,5 +1,8 @@
-namespace Umbraco.Cms.Core.Services;
+namespace Umbraco.Cms.Core.Services;
+///
+/// Defines methods for resolving user keys to user IDs and vice versa without retrieving full user details.
+///
public interface IUserIdKeyResolver
{
///
diff --git a/src/Umbraco.Infrastructure/Services/Implement/UserIdKeyResolver.cs b/src/Umbraco.Infrastructure/Services/Implement/UserIdKeyResolver.cs
index d11c4a09af9b..f8b7e99b2902 100644
--- a/src/Umbraco.Infrastructure/Services/Implement/UserIdKeyResolver.cs
+++ b/src/Umbraco.Infrastructure/Services/Implement/UserIdKeyResolver.cs
@@ -1,4 +1,4 @@
-using System.Collections.Concurrent;
+using System.Collections.Concurrent;
using NPoco;
using Umbraco.Cms.Core;
using Umbraco.Cms.Core.Services;
@@ -9,8 +9,13 @@
namespace Umbraco.Cms.Infrastructure.Services.Implement;
-// It's okay that we never clear this, since you can never change a user's key/id
-// and it'll be caught by the services if it doesn't exist.
+///
+/// Implements for resolving user keys to user IDs and vice versa without retrieving full user details.
+///
+///
+/// It's okay that we never clear this, since you can never change a user's key/id
+/// and it'll be caught by the services if it doesn't exist.
+///
internal sealed class UserIdKeyResolver : IUserIdKeyResolver
{
private readonly IScopeProvider _scopeProvider;
@@ -19,6 +24,9 @@ internal sealed class UserIdKeyResolver : IUserIdKeyResolver
private readonly SemaphoreSlim _keytToIdLock = new(1, 1);
private readonly SemaphoreSlim _idToKeyLock = new(1, 1);
+ ///
+ /// Initializes a new instance of the class.
+ ///
public UserIdKeyResolver(IScopeProvider scopeProvider) => _scopeProvider = scopeProvider;
///
@@ -28,6 +36,14 @@ public async Task GetAsync(Guid key)
///
public async Task> TryGetAsync(Guid key)
{
+ // The super-user Id and key is known, so we don't need a look-up here.
+ if (key == Constants.Security.SuperUserKey)
+ {
+#pragma warning disable CS0618 // Type or member is obsolete
+ return Attempt.Succeed(Constants.Security.SuperUserId);
+#pragma warning restore CS0618 // Type or member is obsolete
+ }
+
if (_keyToId.TryGetValue(key, out int id))
{
return Attempt.Succeed(id);
@@ -76,6 +92,14 @@ public async Task GetAsync(int id)
///
public async Task> TryGetAsync(int id)
{
+ // The super-user Id and key is known, so we don't need a look-up here.
+#pragma warning disable CS0618 // Type or member is obsolete
+ if (id is Constants.Security.SuperUserId)
+#pragma warning restore CS0618 // Type or member is obsolete
+ {
+ return Attempt.Succeed(Constants.Security.SuperUserKey);
+ }
+
if (_idToKey.TryGetValue(id, out Guid key))
{
return Attempt.Succeed(key);
diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/UserIdKeyResolverTests.cs b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/UserIdKeyResolverTests.cs
index f2ca4fd81800..2decb73ce09e 100644
--- a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/UserIdKeyResolverTests.cs
+++ b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/UserIdKeyResolverTests.cs
@@ -1,7 +1,6 @@
using NUnit.Framework;
using Umbraco.Cms.Core;
using Umbraco.Cms.Core.Models;
-using Umbraco.Cms.Core.Models.Membership;
using Umbraco.Cms.Core.Services;
using Umbraco.Cms.Tests.Common.Testing;
using Umbraco.Cms.Tests.Integration.Testing;