Research
The single sign-on gap
A homelab is only as unified as its worst application, and about a third of the ones people actually run have no way to accept an outside identity at all.
How many self-hosted apps actually support single sign-on?
Of the 90 indexed self-hosted tools that have user accounts, 45 support OIDC natively (50.0 percent) and 51 support it in some form including official plugins (56.7 percent). 28 of them, 31.1 percent, offer nothing you can federate: local accounts, a shared password, or an auth proxy in front and a second login behind it. That last group is what stops a homelab from having one login, and no identity provider can fix it for you.
Of the 90 indexed tools that have user accounts, 45 support OpenID Connect natively, which is 50.0 percent. Counting official and de-facto plugins takes it to 51, or 56.7 percent. The remaining 28, 31.1 percent, have nothing to federate: local accounts, a single shared password, or no authentication at all and an instruction to put a proxy in front.
That last number is the one that decides your architecture. You do not get a unified login by picking a good identity provider. You get it by not running anything from the third group, which for most households is not a choice they are willing to make.
"Supports OIDC" is five different claims#
The phrase collapses five arrangements that deliver very different things. Sorting the index into them is most of the value here.
Native OIDC. The application is an OIDC relying party in its own code. You give it an issuer URL, a client ID and a secret, and it redirects to your provider. 45 tools are here. The good implementations also map claims to roles and let you turn off local login: Mealie has ALLOW_PASSWORD_LOGIN=false, Karakeep has DISABLE_PASSWORD_AUTH and OAUTH_AUTO_REDIRECT, Beszel has DISABLE_PASSWORD_AUTH. That is the full-fat version and it is what you should be shopping for.
Plugin OIDC. Six tools. The code is not in the core project, which means it has its own release cadence and its own bus factor. Jellyfin is the cautionary example: the LDAP plugin is official, the SSO plugin is not, and the 9p4 repository that hosted it was archived on 12 May 2026. A community fork carries it on, but if you configured the old manifest URL you simply stopped receiving updates, silently. Nextcloud is the better version of the same shape, where user_oidc is maintained in the app store but still has to survive every major upgrade.
LDAP only. Five tools, and this is where the language gets sloppiest. LDAP gives you one password everywhere. It does not give you one session. Every app still shows its own login form, you still type credentials into each one, and logging out of one logs you out of nothing else. LLDAP exists precisely to serve this group cheaply, at 15 MB idle and an ops load of 1 out of 5.
Trusted header auth. Six tools. The proxy authenticates you and injects a header such as Remote-User, and the app creates or looks up that account and logs you in. This genuinely feels like single sign-on. It is also a total compromise the moment anything can reach the application directly, because the header is just a header and anyone who can connect to the port can set it. Navidrome auto-creates users this way and the first one created becomes an admin, so an unprotected port 4533 is an admin account for whoever asks first. Every implementation ships a trust list: ND_REVERSEPROXYWHITELIST, Miniflux's TRUSTED_REVERSE_PROXY_NETWORKS, FreshRSS's trusted_sources. FreshRSS additionally auto-registers unknown users, which turns a permissive CIDR into open registration.
Forward auth only. Eight tools, and this is the category people miscount. Forward auth is a proxy decision: Caddy's forward_auth or a Traefik middleware asks Authelia whether this request may pass. If it may, the request goes through, and the application behind it has learned nothing about you and asks you to log in again. You have one authorization decision and two logins. It is worth doing for code-server, whose entire auth model is one shared password in a YAML file, and for Netdata, whose port 19999 dashboard has no login at all. It is not federation.
| Tool | Category | Identity | Note |
|---|---|---|---|
| Actual Budget | Productivity | Native OIDC | OpenID or OAuth2 login is built in and marked preview, configured in `config.json` or the admin UI; it is also the prerequisite for multi-user. |
| Audiobookshelf | Media | Native OIDC | Built-in OpenID Connect with an auto-populate button that reads the provider's discovery document; no plugin needed, and the mobile apps support the OIDC flow too. |
| Beszel | Monitoring | Native OIDC | PocketBase OAuth2 and OIDC providers are built in, password auth can be turned off with `DISABLE_PASSWORD_AUTH`, and `TRUSTED_AUTH_HEADER` supports forwarded auth. |
| BookStack | Documents | Native OIDC | OIDC, SAML2 and LDAP are all first-party and configured with environment variables, including group to role sync; no plugin and no reverse proxy trickery required. |
| Coolify | Platforms | Native OIDC | OAuth providers have been supported for some time and OpenID Connect login landed in the 4.4 release candidate; check your version before promising SSO to anyone. |
| Forgejo | Developer | Native OIDC | OAuth2/OIDC and LDAP are built-in authentication sources in the admin UI, no plugin needed, and you can disable local registration entirely. |
| FreshRSS | Feeds | Native OIDC | Form login, HTTP Basic, reverse-proxy headers (`Remote-User` or `X-WebAuth-User` from a CIDR in `trusted_sources`) and OpenID Connect are all supported in core, with auto-registration of new users on first proxy login. |
| Gatus | Monitoring | Native OIDC | Built-in OIDC under `security.oidc` with an issuer URL and an allowed-subjects list, plus basic auth as the simpler option. |
| GitLab CE | Developer | Native OIDC | OmniAuth ships in the free self-managed build with OIDC, SAML, LDAP and social providers configured in `gitlab.rb`; LDAP group sync and multiple LDAP servers are Premium. |
| Gitea | Developer | Native OIDC | OAuth2/OIDC and LDAP are built-in authentication sources configured from the admin panel, with optional auto-provisioning of accounts. |
| Gotify | Communication | Native OIDC | OIDC login is built in from v3, with group claims mapped to user and admin roles and an optional auto-redirect; before v3 it was local accounts only. |
| Grafana | Monitoring | Native OIDC | Generic OAuth2 and OIDC plus named providers (Google, GitHub, Azure AD, Okta, Keycloak) are in the free build; SAML, LDAP team sync and role-based access control are Enterprise. |
| Harbor | Developer | Native OIDC | OIDC and LDAP/AD are first-class auth backends configured in the admin UI, with OIDC group claims mapped onto Harbor project roles; switching auth mode after users exist is one-way. |
| Headscale | Networking | Native OIDC | Built-in OIDC: point it at Authentik, Keycloak or Google and node registration goes through your IdP instead of pre-auth keys. |
| HedgeDoc | Documents | Native OIDC | Generic OAuth2/OIDC via the `CMD_OAUTH2_*` variables plus LDAP, SAML, GitHub, GitLab and Google; local email sign-in also exists and is on by default. |
| Homarr | Dashboards | Native OIDC | Credentials, OIDC and LDAP are all first-class in the box, selected through the auth provider environment variables, with per-user and per-group board permissions. |
| Homepage | Dashboards | Native OIDC | v2.0 added a built-in gate (`HOMEPAGE_AUTH_ENABLED`) with either a single shared password or OIDC, but it grants access to any identity your provider authorizes for the client and applies no claim or group checks of its own. |
| Immich | Photos and files | Native OIDC | OIDC is built into the server with claim-based storage quota and role mapping, but local password login stays on until you explicitly disable it in admin settings. |
| Karakeep | Feeds | Native OIDC | Any OIDC-compliant provider via `OAUTH_WELLKNOWN_URL`, `OAUTH_CLIENT_ID` and `OAUTH_CLIENT_SECRET`, with `DISABLE_PASSWORD_AUTH` and `OAUTH_AUTO_REDIRECT` to make it the only path; the callback is `/api/auth/callback/custom`. |
| Kavita | Media | Native OIDC | Native OpenID Connect landed in v0.8.8 and can run alongside or fully replace local accounts, including mapping provider roles to library access and age restrictions. |
| Keycloak | Identity | Native OIDC | Keycloak is the issuer, and it federates upward too: identity brokering to other OIDC and SAML providers, plus LDAP and Kerberos user federation with configurable write-back. |
| Komodo | Platforms | Native OIDC | Built-in OIDC plus GitHub and Google OAuth, configured through `KOMODO_OIDC_*` environment variables with PKCE support. |
| Mattermost | Communication | Native OIDC | OIDC and SAML are compiled into the binary but unlock only with a license key; from v11 Team Edition lost even GitLab SSO, so free self-hosters get local accounts. |
| Mealie | Productivity | Native OIDC | Native OIDC with discovery, admin and group claim mapping, and `ALLOW_PASSWORD_LOGIN=false` to hide the local login form entirely. |
| Miniflux | Feeds | Native OIDC | Generic OIDC and Google are built in via `OAUTH2_PROVIDER`, plus header-based proxy auth through `AUTH_PROXY_HEADER` (which requires `TRUSTED_REVERSE_PROXY_NETWORKS`), and WebAuthn passkeys for local accounts. |
| Open WebUI | Local AI | Native OIDC | Generic OIDC and several named OAuth providers are built in, with role and group claim mapping, but `WEBUI_URL` must be set correctly first or the redirect fails. |
| Outline | Documents | Native OIDC | Generic OIDC plus Google, Slack, Microsoft Entra and Discord are built in, and at least one of them is mandatory: there is no local username and password login at all. |
| Paperless-ngx | Documents | Native OIDC | OIDC through django-allauth, configured as a JSON blob in `PAPERLESS_SOCIALACCOUNT_PROVIDERS` plus an entry in `PAPERLESS_APPS`; group sync from claims works, and a `Remote-User` header mode exists separately. |
| PhotoPrism | Photos and files | Native OIDC | OpenID Connect login is listed as available in the free Community Edition, but the User Management web UI that makes multi-user setups pleasant is a Plus feature. |
| Pocket ID | Identity | Native OIDC | It is the OIDC issuer, OpenID Certified, and it can sync users and groups inward from an LDAP directory. There is no SAML, no upstream social login and no password login. |
| Portainer | Platforms | Native OIDC | CE supports LDAP and generic OAuth login; Active Directory, provider templates and group-to-team mapping are Business Edition only. |
| Proxmox VE | Platforms | Native OIDC | Realms include OpenID Connect, LDAP and Active Directory natively, plus built-in TOTP and WebAuthn two-factor. |
| Synapse | Communication | Native OIDC | `oidc_providers`, SAML2 and CAS are configured directly in homeserver.yaml, but Element's strategic path is now the separate Matrix Authentication Service. |
| Technitium DNS Server | Networking | Native OIDC | OpenID Connect single sign-on with scope and group-to-role mapping shipped in v15 (April 2026); before that it was local accounts only. |
| Trilium Notes | Documents | Native OIDC | Direct OpenID Connect and TOTP support are built into the server for login; there is no multi-user model, so SSO here authenticates you, it does not partition content. |
| TrueNAS Community Edition | Platforms | Native OIDC | Active Directory and LDAP directory services, plus OIDC-based identity provider support in the recent releases for web UI login. |
| Unraid | Platforms | Native OIDC | Unraid 7.2 added optional OIDC single sign-on to the WebGUI via the built-in Unraid API; before that it was a single root password. |
| Vaultwarden | Identity | Native OIDC | OIDC login is built in since 1.35.0, but a master password is still required and is not controlled by the identity provider, because it derives the vault key. |
| Vikunja | Productivity | Native OIDC | Built-in OpenID Connect against any provider, plus LDAP added in 1.0.0; no plugin needed. |
| Wiki.js | Documents | Native OIDC | Generic OpenID Connect plus a long list of first-party strategies (Azure AD, Google, GitHub, Keycloak, Auth0, LDAP, SAML), all configured in the admin UI rather than in environment variables. |
| Woodpecker CI | Developer | Native OIDC | There are no local accounts at all: login is OAuth against the configured forge (Forgejo, Gitea, GitHub, GitLab or Bitbucket), so your forge is your identity provider and there is no generic OIDC option. |
| authentik | Identity | Native OIDC | It is the identity provider, and it can also federate upward: OAuth, SAML, LDAP and Kerberos sources let you chain an existing directory or social login behind it. |
| linkding | Feeds | Native OIDC | `LD_ENABLE_OIDC` turns on OpenID Connect and `LD_ENABLE_AUTH_PROXY` plus `LD_AUTH_PROXY_USERNAME_HEADER` covers Authelia-style header auth; note OIDC matches users by email address, not username. |
| mailcow: dockerized | Communication | Native OIDC | Identity providers are configured in the mailcow UI itself: Keycloak, generic OIDC and LDAP, with automatic user creation on first login; mail clients still need app passwords unless you use the Mailpassword flow. |
| wg-easy | Networking | Native OIDC | Local admin accounts with optional TOTP by default; OAuth/OIDC external authentication landed in 15.4.0 (August 2026). |
| Home Assistant | Home automation | OIDC via plugin | No official OIDC provider; people use the HACS custom component hass-oidc-auth or an auth proxy, and the companion mobile apps handle proxy logins badly. |
| Jellyfin | Media | OIDC via plugin | An official LDAP plugin ships in the plugin catalog; OIDC comes from the third-party SSO plugin, whose original repo (9p4) was archived in May 2026 and is now carried by a community fork. |
| Nextcloud | Photos and files | OIDC via plugin | LDAP and SAML integration ship as bundled apps and OIDC comes via the maintained `user_oidc` app; all of it is app-store surface that has to survive every major upgrade. |
| Node-RED | Home automation | OIDC via plugin | `adminAuth` in settings.js accepts local users or any Passport strategy, so OAuth2 and OIDC work through an installed strategy module rather than a built-in provider. |
| Seafile | Photos and files | OIDC via plugin | OAuth/OIDC and basic LDAP are configurable in the Community Edition; SAML, ADFS, Shibboleth and LDAP group sync are Professional Edition features. |
| Wazuh | Security | OIDC via plugin | SAML single sign-on to the dashboard through the indexer's security plugin, with documented setups for Entra ID, Okta, Keycloak and authentik; the docs cover SAML rather than OIDC. |
| Dozzle | Monitoring | Trusted proxy header | Either a bcrypt `users.yml` file for local accounts, or forward-proxy mode trusting `Remote-User`, `Remote-Email` and `Remote-Name` from Authelia, oauth2-proxy or Cloudflare Access. No native OIDC. |
| File Browser | Photos and files | Trusted proxy header | Authentication is local JSON accounts, a proxy header method that trusts an upstream-injected username, a command hook, or no auth at all; there is no OIDC and sessions are unrevocable JWTs. |
| Firefly III | Productivity | Trusted proxy header | `AUTHENTICATION_GUARD=remote_user_guard` trusts a proxy-injected header (`REMOTE_USER` by default) for Authelia and similar; LDAP support was dropped and there is no built-in OIDC. |
| Frigate | Home automation | Trusted proxy header | Built-in users with PBKDF2 hashing, or disable that and trust `X-Forwarded-User` and `X-Forwarded-Groups` from Authelia or Authentik in front. |
| Navidrome | Media | Trusted proxy header | Reverse proxy authentication via ND_REVERSEPROXYUSERHEADER (default Remote-User) with an ND_REVERSEPROXYWHITELIST CIDR; there is no native OIDC, and Subsonic clients still authenticate with a Navidrome password regardless. |
| grocy | Productivity | Trusted proxy header | `AUTH_CLASS` swaps the auth middleware: local users by default, `ReverseProxyAuthMiddleware` reading a `REMOTE_USER` header, or `LdapAuthMiddleware`. No OIDC. |
| Authelia | Identity | LDAP only | Authelia is the identity provider; its own user source is a YAML file of Argon2id hashes or an LDAP directory, and it cannot federate up to an external OIDC or social provider. |
| Calibre-Web | Media | LDAP only | LDAP works, plus OAuth against GitHub and Google specifically, plus a reverse proxy header login mode; there is no general OIDC, so most people use forward auth and enable the proxy header option. |
| Emby | Media | LDAP only | An LDAP plugin exists and works; there is no first-party OIDC, so anything IdP-shaped means a forward-auth proxy in front of the web UI, which native clients then bypass. |
| LLDAP | Identity | LDAP only | It is the LDAP server and nothing else. No OIDC in either direction, so by itself it gives you one password everywhere, not one session. |
| Stalwart | Communication | LDAP only | Community authenticates against an internal directory, LDAP/Active Directory or SQL; signing in through a third-party OIDC provider such as Keycloak or Authentik is an Enterprise feature. |
| ESPHome | Home automation | Auth proxy only | The Device Builder dashboard has no user model of its own; as a Home Assistant app it inherits ingress auth, standalone it needs a proxy in front. |
| Jellyseerr | Media | Auth proxy only | Login delegates to your media server's accounts (Jellyfin, Emby or Plex) plus local users; native OpenID Connect is still only in a preview branch rather than a stable release, so IdP integration means forward auth in front. |
| Netdata | Monitoring | Auth proxy only | The local agent dashboard has no login of its own; identity comes either from signing in to Netdata Cloud or from an authenticating proxy you put in front of 19999. |
| Prometheus | Monitoring | Auth proxy only | No user accounts at all. Basic auth and TLS can be set in `web.config.yml`; anything with identity in it means an auth proxy in front. |
| Scrutiny | Monitoring | Auth proxy only | There is no login at all on the web UI or the API, so anything resembling access control has to be an authenticating proxy in front of port 8080. |
| Traefik | Networking | Auth proxy only | No user accounts. The dashboard is unauthenticated unless you put a BasicAuth or ForwardAuth middleware in front of it, which is also how you bolt Authelia onto backends. |
| code-server | Developer | Auth proxy only | Authentication is a single shared password in `~/.config/code-server/config.yaml`; there are no user accounts, so anything more than one person means an auth proxy in front. |
| wallabag | Feeds | Auth proxy only | Local accounts with optional two-factor by email or TOTP; there is no OIDC and no supported LDAP in core, so SSO means an auth proxy in front and a matching local user. |
| AdGuard Home | Networking | Local accounts only | Local users defined in AdGuardHome.yaml with bcrypt hashes, served over HTTP basic auth. No OIDC, no LDAP, no plugin path. |
| CasaOS | Platforms | Local accounts only | A single local account created at first boot, no LDAP, no OIDC, and no meaningful multi-user model. |
| Docmost | Documents | Local accounts only | The community edition has local accounts only; SAML 2.0, OIDC, LDAP, MFA and SCIM are all gated behind the paid Business or Enterprise tier and require a licence key. |
| Dokploy | Platforms | Local accounts only | Local accounts with two-factor and invitations; there is no OIDC login for the dashboard itself. |
| Duplicati | Backup | Local accounts only | Local password only, mandatory since 2.1.0. Proxy setups are supported through `DUPLICATI__WEBSERVICE_PRE_AUTH_TOKENS`, but there is no OIDC or LDAP. |
| Glance | Dashboards | Local accounts only | Local users only, defined in the `auth` block of the config with bcrypt hashes; there is no OIDC, no LDAP and no header trust, so put an auth proxy in front if you need real identity. |
| Kopia | Backup | Local accounts only | `kopia server` has its own username and password list plus optional TLS client certificates. There is no OIDC or LDAP; put it behind an authenticating proxy if you need identity. |
| MinIO | Backup | Local accounts only | External identity via OIDC and LDAP was removed from the community build in RELEASE.2025-05-24 and moved into the commercial product. What is left is local access keys and policies. |
| Nginx Proxy Manager | Networking | Local accounts only | Local accounts only, with per-user permissions and an audit log. No OIDC, no LDAP, and none is planned in the v2 line. |
| PLANKA | Productivity | Local accounts only | OIDC existed in the community edition until 2.2.0 removed it to PLANKA Pro; local accounts with optional TOTP are what remains. |
| Pi-hole | Networking | Local accounts only | A single web password with optional TOTP, plus generated application passwords for scripts. No user accounts, no OIDC, no LDAP. |
| Plex Media Server | Media | Local accounts only | Identity belongs to plex.tv: accounts, sharing and login all route through Plex's cloud, there is no way to point it at your own IdP, and managed users under Plex Home are the closest thing to a local account. |
| Prowlarr | Media | Local accounts only | Local forms or basic login only, with no LDAP or OIDC; the API key is the real credential, and it is the one the *arr apps use, so treat it like a shared secret. |
| Radarr | Media | Local accounts only | Local forms login only; v6 removed basic auth entirely, there is no LDAP or OIDC, and the API key bypasses the UI login for anything holding it. |
| Sonarr | Media | Local accounts only | Forms or basic login against a local user only, mandatory since v4; there is no LDAP or OIDC, so SSO means a forward auth proxy, and the API key bypasses it entirely for any client that has it. |
| Syncthing | Photos and files | Local accounts only | The web GUI has a single local username and password and no identity integration; if you expose it, put an authenticating proxy in front of 8384. |
| Uptime Kuma | Monitoring | Local accounts only | Local accounts with optional TOTP only; the OAuth support in the codebase authenticates monitored endpoints, not people logging in. |
| Zigbee2MQTT | Home automation | Local accounts only | The frontend has one shared `auth_token` in configuration.yaml, no user accounts and no OIDC, so put a proxy in front if it leaves your LAN. |
| n8n | Dashboards | Local accounts only | The self-hosted community build has local accounts only: SAML, OIDC and LDAP are all gated behind an Enterprise plan, so free self-hosters put an auth proxy in front or live with n8n's own user table. |
| ntfy | Communication | Local accounts only | Local users and per-topic ACLs managed with `ntfy access`; there is no OIDC or LDAP, so put an auth proxy in front of the web app if you need single sign-on. |
The recent arrivals, the retreats, and the never#
Three movements are visible in the data, and they point in different directions.
OIDC arrived recently in a cluster of infrastructure tools that spent years with a single admin password. Technitium DNS Server shipped OIDC with scope and group-to-role mapping in v15 in April 2026. Unraid added it to the WebGUI in 7.2 through its built-in API. wg-easy got OAuth and OIDC in 15.4.0 in August 2026. Kavita landed native OIDC in v0.8.8 with role mapping onto library access. Vaultwarden has had it since 1.35.0. If your mental model of self-hosted SSO is from 2023, it is out of date in your favor.
The retreats went the other way and cost people real work. PLANKA 2.2.0 removed OIDC to PLANKA Pro and deactivated every SSO-created user, because those accounts had no password to fall back on. Recovery is an admin setting a password for each one and reactivating them individually. MinIO removed LDAP and OIDC from the community build in the May 2025 release and moved them into the commercial product, in the same release that took away the console. Mattermost Team Edition lost GitLab SSO, its only method, in v11. Docmost gates SAML, OIDC and LDAP behind a Business tier at 6 dollars per seat per month with a ten seat minimum. n8n does the same under an Enterprise plan. Stalwart Community will act as an OIDC provider but will not accept logins from one without an Enterprise license.
And some will never have it, for structural reasons rather than neglect. Plex cannot federate because identity is plex.tv by design. Sonarr, Radarr and Prowlarr have forms login and an API key that bypasses it entirely for anything holding it, so the login is not really the credential. Pi-hole and AdGuard Home have one web password because they are resolvers, not multi-user applications. Nginx Proxy Manager has no plans for it in the v2 line. Syncthing, Zigbee2MQTT and Glance are all single-secret designs. Waiting for these is not a plan.
What to actually do with this distribution#
Run a small provider, not a large one. Given that 56.7 percent of the apps with accounts can consume OIDC, the provider's job is mostly issuing tokens, and the cheap options do that well. Pocket ID is 30 MB idle, ops load 1, passkey-only and OpenID Certified. Authelia is 35 MB and gives you forward auth in the same process, which matters because you will need it. authentik is a genuinely capable IdP and costs about 1 GB of RAM and an ops load of 4 out of 5; pick it when you actually need SAML, an LDAP outpost or upstream federation, not by default. Keycloak is 750 MB and an upgrade path with real cliffs in it. The head to head reading is Pocket ID vs Authelia and Authelia vs authentik.
Then accept the split. Federate everything that can federate. Put forward auth in front of the handful that cannot, and accept the second login there. Add LLDAP if you have two or three LDAP-only holdouts worth keeping. This is a three-container identity layer under 100 MB, and it is the honest answer for a household.
The network path matters as much as the config. Header auth and forward auth are both only as strong as the guarantee that the app is unreachable except through the proxy. That means not publishing the container port at all, putting the app on an internal Docker network with only the proxy attached, and remembering that published ports bypass UFW because Docker writes its own iptables chains. Reverse proxy and TLS covers the proxy side and A security baseline for a home server covers the host side.
One more failure mode worth designing against: Outline has no local accounts at all, ever. If your provider's certificate expires or its container fails to start, nobody can get into Outline to fix anything. A single provider is a single point of failure for your entire estate, so keep a break-glass path: a local admin account on the apps that allow one, and a tested restore of the provider's own database.
Next step#
Run your own list against the our methodology definitions and count how many of your apps land in the none and proxy-only rows of the table above. If the answer is more than three, your first move is not installing an identity provider, it is deciding which of those three you are willing to replace. Single sign-on for self-hosters walks the actual setup, and Stack planner will show you the identity load of a stack before you build it.
Questions#
Is forward auth the same as single sign-on?
No. Forward auth gates the HTTP request at the proxy: the proxy asks your identity provider who you are, and if it approves, the request is passed through. The application behind it never learns who you are, so it shows you its own login form as well. You get one authorization decision and two logins. It is a real security control and a poor identity experience, which is why the distinction matters when you are counting which of your apps are actually federated.
Which self-hosted identity provider should I run?
Start with Pocket ID if every app you care about speaks OIDC: it is one Go binary, about 30 MB idle, passkey-only, and there is very little to operate. Choose Authelia if you also need forward auth for apps that cannot federate, since it does both from one config file at around 35 MB. Choose authentik only if you specifically need SAML, an LDAP outpost or user federation, and accept roughly 1 GB of RAM and an ops load of 4 out of 5 for it.
Is proxy header authentication safe?
Only if nothing can reach the application except through the proxy. Header auth means the app trusts a header such as Remote-User and logs that person in with no password. If the container port is published on the LAN, anyone who can reach it sets the header and becomes any user, including the admin. Every app that supports it also ships a trust list for exactly this reason: Navidrome's ND_REVERSEPROXYWHITELIST, Miniflux's TRUSTED_REVERSE_PROXY_NETWORKS, FreshRSS's trusted_sources. Set it, and stop publishing the port.
Does OIDC support mean I can turn off local passwords?
Not always, and this is the most common disappointment. Immich keeps password login enabled until you explicitly disable it in admin settings. Vaultwarden supports OIDC since 1.35.0 but still requires a master password, because that password derives your vault key and the identity provider cannot hold it. Jellyfin's SSO plugin only covers the web UI, so native clients keep authenticating against Jellyfin's own user table. Check whether the local login can actually be disabled before you call an app federated.
What happens when a project moves OIDC behind a paywall?
You find out on upgrade, usually badly. PLANKA 2.2.0 moved OIDC to PLANKA Pro and deactivated every SSO-created user in the process, because those accounts had no password to fall back on; an admin has to set a password and reactivate each one by hand. MinIO removed LDAP and OIDC from the community build in the May 2025 release. Mattermost Team Edition lost its last SSO method in v11. Read breaking changes before pulling a tag on anything that holds your logins.
How many logins should a household realistically expect?
Two. One at your identity provider, which covers the 51 apps that federate, and one more shared between whichever holdouts you actually use, typically a media server and a couple of *arr apps whose API keys matter more than their passwords anyway. Trying to get to exactly one login usually means either running an app you like less or putting header auth on something that is reachable directly, which trades a small annoyance for a real vulnerability.
Sources#
- PLANKA changelog, 2.2.0 breaking changes moving OIDC to Pro
- Docmost editions, SSO gated to Business and Enterprise
- n8n documentation, OIDC as an Enterprise feature
- MinIO releases, including the May 2025 removal of external identity
- Mattermost editions and offerings, Team Edition limits
- Jellyfin SSO plugin repository, archived May 2026
- Technitium DNS Server v15 release notes, OIDC single sign-on
- Unraid 7.2.0 release notes, OIDC for the WebGUI
- FreshRSS access control, proxy headers and trusted_sources
- Navidrome documentation, externalized authentication
Published . Last reviewed . Found something out of date? Tell us and we will fix it and log the change.