Description
I am configuring OpenID Connect authentication with Microsoft Entra ID (Azure AD) in Gitea. Authentication succeeds, but users are never auto-created. Instead, Gitea consistently redirects to:
/user/link_account
This occurs even when auto-registration is enabled and required claims appear to be configured.
Environment
-
Gitea version: latest (Docker image
gitea/gitea:latest) -
Deployment: Docker Compose
-
Database: PostgreSQL
-
Auth provider: Microsoft Entra ID (OIDC)
Configuration
Gitea app.ini (relevant sections)
[service]
DISABLE_REGISTRATION = true
ALLOW_ONLY_EXTERNAL_REGISTRATION = true
REQUIRE_SIGNIN_VIEW = true
[oauth2]
ENABLE_AUTO_REGISTRATION = true
OIDC Provider (Gitea UI)
-
Provider: OpenID Connect
-
Auto Discover URL: configured (Microsoft well-known endpoint)
-
Scopes:
openid profile email -
Auto Registration: enabled
Microsoft Entra Configuration
-
ID token optional claims added:
-
email -
preferred_username -
upn
-
-
API permissions:
-
openid -
profile -
email
-
-
Admin consent granted
Observed Behavior
-
OAuth flow completes successfully
-
Callback endpoint is hit:
/user/oauth2/Microsoft/callback -
Gitea returns HTTP 303 and redirects to:
/user/link_account -
No user is created automatically
Relevant logs:
GET /user/oauth2/Microsoft/callback ... 303 See Other
GET /user/link_account ... 200 OK
Expected Behavior
With ENABLE_AUTO_REGISTRATION = true, Gitea should:
-
Extract user identity from OIDC claims
-
Automatically create a new user
-
Log the user in
Additional Notes / Debugging
-
Debug logging enabled (
[log] LEVEL = debug) -
No OIDC claims are printed in logs
-
Behavior is consistent across multiple login attempts
-
Manual user creation + account linking works
Suspected Issue
It appears Gitea is rejecting the OIDC identity for auto-registration, possibly due to:
-
Missing or untrusted
emailclaim -
Lack of
email_verified -
Incompatible or missing username mapping (
preferred_usernamevssub) -
Strict validation of OIDC claims from Microsoft Entra
However, there is no clear log output indicating which field is failing validation.
Questions
-
What exact claims are required for auto-registration to succeed?
-
Does Gitea require
email_verified = true? -
Which claim is used as the canonical username (
sub,preferred_username, oremail)? -
Is Microsoft Entra ID officially supported/tested with OIDC in Gitea?
-
Can more verbose logging be enabled for OIDC claim validation failures?
Reproduction
-
Configure Microsoft Entra OIDC provider
-
Enable auto-registration in Gitea
-
Attempt login via OAuth2
-
Observe redirect to
/user/link_accountinstead of account creation
Workaround
-
Manually creating users and linking accounts works
-
Considering using an intermediary IdP (e.g., Authentik) to normalize claims
Summary
OIDC authentication with Microsoft Entra succeeds, but auto-registration consistently fails without clear error messaging, forcing manual account linking.
Better documentation or logging around required claims and validation failures would help significantly.