Skip to content

feat: Add support for skipping the email_verified claim on email issuer types#2220

Merged
Hayden-IO merged 1 commit into
sigstore:mainfrom
mogthesprog:morganj/skip-email-verified
Nov 30, 2025
Merged

feat: Add support for skipping the email_verified claim on email issuer types#2220
Hayden-IO merged 1 commit into
sigstore:mainfrom
mogthesprog:morganj/skip-email-verified

Conversation

@mogthesprog

Copy link
Copy Markdown
Contributor

Summary

This PR adds support for enterprise identity providers (Microsoft Entra/Azure AD, ADFS) that don't include the email_verified claim in their OIDC tokens.

Problem: Enterprise identity providers often handle email verification through centralized identity management systems rather than including an email_verified claim in OIDC tokens. Fulcio currently requires this claim to be present and set to true for all email-type issuers, which blocks valid tokens from these enterprise providers and prevents internal Fulcio deployments in organizations using Microsoft Entra, ADFS, or similar systems.

Solution: Added a new optional skip-email-verification configuration field per OIDC issuer. When set to true, Fulcio will skip the email_verified claim check while still validating email format. This maintains security by default (requires verification) while allowing explicit opt-in for trusted internal providers.

Testing:

  • All existing tests pass, confirming backward compatibility
  • New tests cover scenarios with missing email_verified claims, explicit false values, and true values when skip is enabled
  • Config parsing tests verify YAML and JSON deserialization of the new field

See issue #2219 for additional context.

Release Note

Added optional skip-email-verification configuration field for OIDC issuers to support enterprise identity providers (Microsoft Entra/Azure AD, ADFS) that don't include the email_verified claim in tokens. This field defaults to false to maintain existing security behavior. Operators can set it to true for trusted internal identity providers where email verification is handled through organizational identity management.

Configuration example:

  oidc-issuers:
    https://login.microsoftonline.com/TENANT_ID/v2.0:
      issuer-url: https://login.microsoftonline.com/TENANT_ID/v2.0
      client-id: your-client-id
      type: email
      skip-email-verification: true

Documentation

If we decide to go ahead with this, then i'll update the docs repo too.

@mogthesprog mogthesprog requested a review from a team as a code owner November 21, 2025 22:53
@codecov

codecov Bot commented Nov 21, 2025

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 86.20690% with 4 lines in your changes missing coverage. Please review.
✅ Project coverage is 45.04%. Comparing base (cf238ac) to head (c397b74).
⚠️ Report is 517 commits behind head on main.

Files with missing lines Patch % Lines
pkg/generated/protobuf/fulcio.pb.go 0.00% 4 Missing ⚠️
Additional details and impacted files
@@             Coverage Diff             @@
##             main    #2220       +/-   ##
===========================================
- Coverage   57.93%   45.04%   -12.90%     
===========================================
  Files          50       72       +22     
  Lines        3119     4689     +1570     
===========================================
+ Hits         1807     2112      +305     
- Misses       1154     2342     +1188     
- Partials      158      235       +77     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@Hayden-IO Hayden-IO left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

Comment thread pkg/config/config.go
}

// ToIssuers returns a proto representation of the OIDC issuer configuration.
func (fc *FulcioConfig) ToIssuers() []*fulciogrpc.OIDCIssuer {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you also update this function? This is used to output the server's configuration, e.g. http://fulcio.sigstore.dev/api/v2/configuration

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yeh definitely, will sort this evening.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this should have been addressed now. make gen/lint/test has also been run and committed too

…ssuer

Fixes sigstore#2219

Some enterprise identity providers like Microsoft Entra (Azure AD) and
ADFS don't include the email_verified claim in their OIDC tokens because
email verification happens through their centralized identity management
processes rather than during OIDC token issuance. This caused Fulcio to
reject valid tokens from these providers, impacting some enterprise
deployments.

Added a new optional SkipEmailVerification boolean field to the OIDCIssuer
configuration struct. When set to true for a specific issuer, Fulcio will
skip the email_verified claim check during principal creation while still
validating email format and embedding it in the certificate. This approach
maintains security by default (the field defaults to false) while allowing
operators to explicitly opt-in for trusted internal identity providers.

The implementation moves the issuer configuration lookup earlier in
PrincipalFromIDToken so we can access the SkipEmailVerification flag
before checking email_verified. For meta-issuers with wildcard patterns,
the flag is propagated when constructing concrete issuer configurations.

Added tests coverage for scenarios for tokens with missing email_verified
claims, explicit false values, and true values when skip is enabled.
Updated config parsing tests to verify the new field can be read from
both YAML and JSON configurations.

Signed-off-by: Morgan Jones <mevanj89@gmail.com>
@mogthesprog mogthesprog force-pushed the morganj/skip-email-verified branch from c807735 to c397b74 Compare November 30, 2025 21:21

@Hayden-IO Hayden-IO left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you!

@Hayden-IO Hayden-IO enabled auto-merge (squash) November 30, 2025 23:09
@Hayden-IO Hayden-IO merged commit e902cf8 into sigstore:main Nov 30, 2025
14 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants