feat: log OIDC claims and admin mapping, case-insensitive roles

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Pascal Linxweiler
2026-07-13 14:41:24 +02:00
parent fd36fb246b
commit 606f14dfab
4 changed files with 21 additions and 4 deletions

View File

@@ -101,8 +101,15 @@ public class OidcAuthController : ControllerBase
var roles = result.User.FindAll(Config.RoleClaim).Select(c => c.Value).ToArray();
_logger.LogInformation(
"OIDC login for {Username}. Claims: {Claims}. Roles from claim '{RoleClaim}': [{Roles}]",
username,
string.Join("; ", result.User.Claims.Select(c => $"{c.Type}={c.Value}")),
Config.RoleClaim,
string.Join(", ", roles));
var allowedRoles = SplitCsv(Config.AllowedRoles);
if (allowedRoles.Length > 0 && !roles.Intersect(allowedRoles, StringComparer.Ordinal).Any())
if (allowedRoles.Length > 0 && !roles.Intersect(allowedRoles, StringComparer.OrdinalIgnoreCase).Any())
{
States.TryRemove(state, out _);
_logger.LogWarning("OIDC user {Username} denied: no allowed role. Roles: {Roles}", username, string.Join(",", roles));
@@ -136,7 +143,9 @@ public class OidcAuthController : ControllerBase
var adminRoles = SplitCsv(Config.AdminRoles);
if (adminRoles.Length > 0)
{
user.SetPermission(PermissionKind.IsAdministrator, roles.Intersect(adminRoles, StringComparer.Ordinal).Any());
var isAdmin = roles.Intersect(adminRoles, StringComparer.OrdinalIgnoreCase).Any();
_logger.LogInformation("OIDC admin mapping for {Username}: admin roles [{AdminRoles}] => admin={IsAdmin}", username, Config.AdminRoles, isAdmin);
user.SetPermission(PermissionKind.IsAdministrator, isAdmin);
}
await _userManager.UpdateUserAsync(user).ConfigureAwait(false);

View File

@@ -3,8 +3,8 @@
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<RootNamespace>Jellyfin.Plugin.OidcAuth</RootNamespace>
<AssemblyVersion>1.0.1.0</AssemblyVersion>
<FileVersion>1.0.1.0</FileVersion>
<AssemblyVersion>1.0.2.0</AssemblyVersion>
<FileVersion>1.0.2.0</FileVersion>
<Nullable>enable</Nullable>
<ImplicitUsings>disable</ImplicitUsings>
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>