SSO and SAML Integration in Jenkins

SSO and SAML Integration in Jenkins

A book-style guide to replacing separate Jenkins passwords with one trusted company login: how SAML 2.0 really works, how the Jenkins SAML plugin fits in, how to map groups to permissions, and how to keep the whole thing secure, observable and recoverable.

Picture a large office building with two hundred doors. In the old days, every door had its own lock and its own key, and every employee carried a heavy ring of keys. People lost keys, copied keys, and left the company with keys still in their pockets. Then the building introduced one security desk at the entrance. You show your badge once, the desk checks who you are, and it hands you a stamped visitor pass that every door in the building trusts. Nobody carries a key ring anymore, and when someone leaves, the desk simply stops issuing passes.

Single Sign-On, usually shortened to SSO, is that security desk for your software tools. Jenkins is one of the busiest doors in the building, because it can build, test and release your products. In this guide we will learn how to make Jenkins trust the company security desk using a standard called SAML 2.0. We will start from zero, explain every new word, and go deep enough that an experienced engineer can plan, roll out and operate the integration in a real production environment.

1Why Jenkins Needs Single Sign-On

Before learning how to connect Jenkins to a company login, we need to understand what goes wrong when it is not connected.

What Jenkins is, in one paragraph

Jenkins is an automation server. Teams use it to compile code, run tests, package software and push it to servers. Because it holds the power to change production systems, it usually also holds secrets such as cloud credentials, signing keys and deployment tokens. In other words, Jenkins is not just a tool; it is a powerful and sensitive doorway into your company.

The problem with local Jenkins accounts

Out of the box, Jenkins can keep its own list of users and passwords. That works for a small lab, but in a company it creates real trouble. Each person now has one more password to remember, and people tend to reuse passwords or choose weak ones. When an employee leaves, someone must remember to delete the Jenkins account, and that step is easy to forget. Nobody can enforce company rules such as multi-factor authentication or password rotation on a private Jenkins list.

Simple Analogy

Local Jenkins accounts are like a small side door in the building that has its own lock and its own key box, managed by one tired person. The main security desk has no idea who walked through the side door, and it cannot lock it when an employee is fired.

What SSO changes

With SSO, Jenkins stops storing passwords entirely. It asks the company identity system, “Who is this person?”, and trusts the answer. Password rules, multi-factor prompts, account lockouts and employee offboarding all live in one place. When the security team disables a person in the central directory, that person can no longer sign in to Jenkins either, without anyone touching Jenkins.

1
place to manage every employee identity
0
passwords stored inside Jenkins
1 click
to disable access everywhere at offboarding
i
Why it matters for audits

Auditors love SSO because every login is tied to a real named person in a central system, with one consistent policy and one consistent log. It turns “who had access to the build server last March?” from a detective story into a simple report.

2Identity Foundations You Must Know First

Three simple ideas sit underneath every SSO project. If these are clear, the rest of the guide becomes easy.

Idea 1

Authentication

Proving who you are. It answers the question “Are you really Priya?” Passwords, fingerprints and phone approvals are all ways of authenticating.

Idea 2

Authorization

Deciding what you are allowed to do after we know who you are. It answers “Can Priya start the production deployment job?”

Idea 3

Federation

Trust between two separate systems so that one can accept the identity checks done by the other. Jenkins does not verify people; it federates with the company identity system.

Idea 4

Single Sign-On

The user experience that results from federation: sign in once in the morning and reach many applications without typing the password again.

Simple Analogy

At an airport, the passport check is authentication. The boarding pass that decides whether you may enter the business lounge is authorization. And the fact that the lounge staff trust the airline’s check instead of re-inspecting your passport is federation.

The split that Jenkins makes

Jenkins has a very clean design here. It separates authentication and authorization into two independent settings. One setting, called the security realm, decides how people prove who they are. The other, called the authorization strategy, decides what each known person may do. SAML replaces only the first one. Everything about permissions still lives in Jenkins, and that detail is the source of most planning decisions later in this guide.

!
Common misconception

Many people believe that turning on SAML automatically gives the right people the right permissions. It does not. SAML only answers “who is this?” and optionally “which groups are they in?” Jenkins still needs an authorization strategy that turns those groups into actual permissions.

3SAML 2.0 Core Concepts

SAML stands for Security Assertion Markup Language. It is a mature, XML-based standard, finalized in 2005, that lets one system tell another system who a person is in a way that can be cryptographically trusted.

SAML has its own vocabulary. Learn these words once and every vendor document becomes readable, whether it comes from Okta, Microsoft Entra ID, Keycloak, Ping Identity or Active Directory Federation Services.

Role

Identity Provider (IdP)

The system that knows the user’s password and does the real login. Example: Okta or Entra ID. It is the security desk.

Role

Service Provider (SP)

The application that wants to know who the user is. In this guide, Jenkins is the service provider. It is the door.

Message

Assertion

The signed statement from the IdP that says “this is Priya, she signed in at this moment, and she belongs to these groups.” It is the stamped visitor pass.

Message

AuthnRequest

The request that Jenkins sends to the IdP saying “please authenticate this user and send me back an assertion.”

Config

Metadata

A machine-readable description of a party: its identifier, its web addresses and its public certificates. The two sides exchange metadata once, like exchanging business cards.

Config

Entity ID

The unique name of a party in the SAML world. Jenkins has one, and the IdP has one. They must match exactly on both sides.

Endpoint

Assertion Consumer Service (ACS)

The web address in Jenkins that receives the signed assertion after login. If this address is wrong, the whole flow fails.

Identity

NameID

The main identifier of the person inside the assertion, such as an email address or a stable internal ID.

Identity

Attributes

Extra facts about the person inside the assertion: display name, email, department and, importantly for Jenkins, group memberships.

Transport

Binding

The method used to carry a SAML message through the browser. The two common ones are HTTP-Redirect, which puts the message in the web address, and HTTP-POST, which puts it in a hidden form.

Simple Analogy

Imagine the visitor pass again. The assertion is the pass itself. The signature is the special hologram that the door staff recognise. Metadata is the sheet, exchanged in advance, that tells the door staff what the hologram looks like. Without that sheet, a perfect pass would still look like a random piece of paper.

i
The browser is the courier

A surprising fact about SAML is that Jenkins and the IdP usually never talk to each other directly during a login. The user’s browser carries every message between them. This is why Jenkins does not need a network path to the IdP for the login itself, and why the signature on the message matters so much: the courier must not be able to forge or change the letter.

4The Login Flow, Step by Step

Now we put the vocabulary into motion and follow one person from the moment they open Jenkins to the moment they see the dashboard.

The service-provider-initiated flow

This is the flow that matters most for Jenkins, because people normally start by opening a Jenkins link from a bookmark, a chat message or a pull request. Jenkins is the one that notices the visitor is a stranger and starts the conversation.

sequenceDiagram
    participant U as User Browser
    participant J as Jenkins (Service Provider)
    participant I as Identity Provider
    U->>J: 1. Open Jenkins page
    J-->>U: 2. Not signed in, redirect with AuthnRequest
    U->>I: 3. Deliver AuthnRequest
    I->>U: 4. Show login and MFA prompt
    U->>I: 5. Prove identity
    I-->>U: 6. Signed assertion in a form
    U->>J: 7. Post assertion to ACS endpoint
    J->>J: 8. Validate signature, time, audience
    J-->>U: 9. Create session, show dashboard
        
FIG 1 — SP-initiated SAML login for Jenkins
1

Visitor arrives without a session

The person opens a Jenkins address. Jenkins sees no valid session cookie and knows it has never met this person in this browser.

2

Jenkins builds an authentication request

Jenkins creates an AuthnRequest that carries its own Entity ID and the address where it wants the answer. It remembers a request identifier so it can match the reply later.

3

The browser is redirected to the IdP

Jenkins does not ask for a password. It simply sends the browser to the IdP login address, carrying the request along.

4

The IdP authenticates the person

If the person already signed in that morning, the IdP recognises its own session and skips the password. This is the “single” in single sign-on. Otherwise it shows the login page and any multi-factor challenge.

5

The IdP issues a signed assertion

The IdP writes the assertion, signs it with its private key and sends it back through the browser to the Jenkins ACS address.

6

Jenkins validates everything

Jenkins checks the signature against the IdP certificate from metadata, confirms the message was meant for Jenkins, verifies the time window and matches it with the original request.

7

Jenkins creates its own session

If all checks pass, Jenkins reads the username and groups from the assertion, creates or updates the matching user record, and gives the browser a normal Jenkins session.

The identity-provider-initiated flow

In this variation the person starts at the company portal, clicks a Jenkins tile, and the IdP sends a ready-made assertion to Jenkins without any request from Jenkins. It feels faster, but it has a security cost: Jenkins receives an answer to a question it never asked, so it cannot match the assertion with a request. Many security teams prefer the SP-initiated flow for exactly this reason, and many organisations disable the IdP-initiated variant for sensitive tools.

!
Watch the deep link

Users often open a link to a specific build page, not the Jenkins home page. A good integration sends them back to that exact page after login. If people always land on the home page, they will complain, so test deep links during your pilot.

5Inside a SAML Assertion: Trust and Validation

Everything in SAML security comes down to one question: why should Jenkins believe this message? The answer is a chain of checks.

What lives inside an assertion

An assertion is a small structured document. Without needing to read the raw XML, you can think of it as having five sections: who issued it, who the subject is, the conditions under which it is valid, a statement about how the person authenticated, and the attribute statement with extra facts such as groups.

PartWhat it saysWhy Jenkins cares
IssuerThe Entity ID of the IdP that created itJenkins only accepts assertions from the IdP it was configured to trust
Subject and NameIDThe person the assertion is aboutBecomes the Jenkins user identity when no other attribute is chosen
ConditionsThe valid time window and the intended audienceStops old or misdirected assertions from being reused
Authentication statementWhen and how the person signed inLets Jenkins enforce a maximum age of the login
Attribute statementEmail, display name, group listFeeds the authorization strategy inside Jenkins
SignatureA digital signature by the IdPProves the content was not changed on the way

The checks Jenkins performs

Check 1

Signature

The message must be signed by a key whose certificate came from the trusted IdP metadata. A bad or missing signature means instant rejection.

Check 2

Audience

The assertion must name Jenkins as its intended recipient. This blocks an assertion meant for another application from being replayed against Jenkins.

Check 3

Time window

The current time must fall between the not-before and not-on-or-after instants, allowing a small tolerance for clock differences.

Check 4

Request matching

In the SP-initiated flow, the reply must refer back to the exact request Jenkins made, which defeats replay of captured messages.

Simple Analogy

A movie ticket is checked in the same way. The guard looks at the hologram (signature), confirms the ticket is for this cinema (audience), for today’s show (time window), and that it matches the seat you booked (request matching). A perfect ticket for yesterday’s show in another city still gets you nowhere.

Certificates and key rotation

The trust relationship is built on certificates. The IdP signs with a private key that never leaves it, and Jenkins holds the matching public certificate. Certificates expire, commonly after one to three years. When the IdP rotates its signing certificate and Jenkins still trusts only the old one, every login fails at the same instant. This is one of the most common causes of a sudden, company-wide Jenkins login outage, and it is entirely preventable with a calendar reminder and a metadata URL that refreshes automatically.

“SAML does not make Jenkins trust the user. It makes Jenkins trust the signature.”

6How Jenkins Handles Security Internally

To integrate SAML safely you need a clear picture of where it plugs into Jenkins and what it leaves untouched.

The two security pillars

Every Jenkins controller has a Security section in its global settings with two independent choices. The first is the security realm, which is the source of truth for identities. Typical realms are the built-in user database, an LDAP directory, or a plugin-provided realm such as SAML or OpenID Connect. The second is the authorization strategy, which decides permissions. Typical strategies are anyone-can-do-anything (never appropriate for production), logged-in-users-can-do-anything, matrix-based security, project-based matrix security, and role-based strategy from a plugin.

flowchart LR
    A["User Browser"] --> B["Jenkins Web Layer"]
    B --> C["Security Realm: SAML Plugin"]
    C --> D["Authenticated User + Groups"]
    D --> E["Authorization Strategy: Matrix or Role Based"]
    E --> F{"Permission granted?"}
    F -->|"Yes"| G["Jobs, Nodes, Credentials, Settings"]
    F -->|"No"| H["Access Denied Page"]
        
FIG 2 — Where SAML sits inside the Jenkins security model

Users are created on first login

When a person signs in through SAML for the first time, Jenkins creates a lightweight user record for them, based on the attributes in the assertion. This record holds things such as the display name, the email, and any API tokens the person creates later. It does not hold a password. Because Jenkins builds this record only after the first login, an administrator cannot assign permissions to a specific person before that person has ever signed in, but can always assign permissions to a group name, which is the recommended approach anyway.

Where the Jenkins home directory fits

Jenkins keeps its settings, user records and job history in a directory on disk called the Jenkins home. The realm choice, the IdP metadata and the plugin options are all stored there. This matters for backups and recovery: if you restore an old copy of this directory, you also restore the old identity settings, which can silently break logins if the IdP certificate has changed since.

i
Design principle

Keep identity in the IdP and permissions in Jenkins groups. If you ever catch yourself assigning permissions to individual usernames in Jenkins, treat it as a warning sign that your group design needs work.

7The Jenkins SAML Plugin: Architecture and Components

Jenkins itself does not speak SAML. The capability comes from a plugin, which is a downloadable extension installed through the plugin manager.

What the plugin does

The SAML plugin, published in the Jenkins ecosystem under the short name saml, adds a new choice to the security realm list called SAML 2.0. Internally it relies on a well-known open source security library to build authentication requests, parse assertions and verify signatures. This is a good sign: the hard cryptographic work is done by a widely reviewed library instead of custom code, and it also means that plugin and library updates are important security updates for you to install.

Component

Realm implementation

Registers SAML as a security realm so that the Jenkins login screen redirects visitors to the IdP instead of showing a password box.

Component

Metadata handling

Reads the IdP metadata, either pasted as text or fetched from a web address, and extracts endpoints and certificates from it.

Component

Callback endpoint

The Jenkins address that receives assertions. By convention it lives under the security realm path and ends with a finish-login action, and this exact full address must be registered at the IdP.

Component

SP metadata generator

Jenkins can publish its own metadata document at a security realm path, so that the IdP administrator can import it instead of typing values by hand.

Component

Attribute mapper

Turns assertion attributes into a Jenkins username, display name, email and list of group authorities, using the attribute names you configure.

Component

Session and logout logic

Controls how long a login stays valid and what happens when a person signs out of Jenkins.

The settings you will meet

The plugin exposes a small, focused set of options. Learning their purpose now will make the configuration chapter feel like a checklist instead of a mystery.

SettingPurposeTypical guidance
IdP metadataTells Jenkins where the IdP is and which certificate to trustPrefer a metadata URL so certificate rotation flows in automatically
Display name attributeWhich attribute is shown as the person’s nameUse the full name attribute so build histories are readable
Group attributeWhich attribute carries group membershipsMust match the exact attribute name the IdP sends
Username attributeWhich attribute becomes the Jenkins user IDChoose a stable value that never gets reused by another person
Email attributeWhich attribute fills the email addressNeeded for notifications and commit author matching
Maximum authentication lifetimeHow long, in seconds, an IdP login is acceptedAlign with the company session policy, not longer
Data binding methodHow the request is carried, redirect or form postFollow what the IdP supports and recommends
Logout URLWhere to send the person after logging out of JenkinsSet to the IdP logout or company portal page
Encryption and signing keystoreLets Jenkins sign its requests and decrypt encrypted assertionsUse it when the security team requires signed requests or encrypted assertions
Username case handlingConverts names to lower or upper caseSet consistently to avoid two records for one person
!
Plugin maintenance

Plugins are part of your security perimeter. Track the plugin security advisories published by the Jenkins project, and keep the SAML plugin and its supporting libraries current. Test upgrades in a staging controller first, because an authentication plugin that fails to load can lock everyone out.

8Planning the Integration Before Touching Anything

Most failed SSO rollouts fail in planning, not in configuration. An hour of careful decisions saves days of recovery.

Decisions to make first

Decision 1: Which identity should Jenkins use as the username?

Options include an email address, a directory account name or an opaque internal ID. Email addresses are readable but can change when someone marries, changes name or the company rebrands. An immutable ID is safest for security but ugly in build logs. Pick one that never gets recycled, and stay with it forever, because changing it later creates a brand new Jenkins user with none of the old permissions or tokens.

Decision 2: How will groups be designed?

Create IdP groups that describe roles, such as build-viewers, project-developers, release-managers and jenkins-admins, instead of one group per person or per job. Fewer, well-named groups are easier to audit. Agree who owns each group and who approves membership.

Decision 3: What happens to machines and scripts?

Command-line tools, webhooks, deployment scripts and other automation cannot click through a browser login. You must plan API tokens and service identities before enabling SAML, or you will break integrations on day one.

Decision 4: What is the emergency plan?

Decide, in writing, how administrators regain control if the IdP is down or misconfigured. A rescue path is part of the design, not an afterthought.

Decision 5: Which environments come first?

Never test on the production controller. Set up a staging Jenkins that mirrors production, register it as a separate application at the IdP, and let a small pilot group use it before the real cut-over.

Prerequisites checklist

Network

Stable HTTPS address

Jenkins must be reachable at a fixed secure web address with a valid certificate. SAML endpoints on plain HTTP are not acceptable.

Config

Correct Jenkins URL

The Jenkins URL setting must match the public address exactly, because Jenkins builds its callback address from it.

Time

Synchronised clocks

Jenkins server time must be synchronised with a reliable time source, since assertions are valid for only minutes.

Access

Admin at the IdP

You need someone who can register an application at the IdP and edit attribute and group releases.

i
Communicate early

Tell developers a week ahead that the login screen will change, that personal API tokens will be needed for scripts, and how to get help. Surprise is the main source of angry tickets during a security change.

9Configuring the Identity Provider Side

The IdP must be told about Jenkins before Jenkins can be told about the IdP. Every vendor uses different screens, but the same seven ideas appear in all of them.

1

Create a new SAML application

In the IdP administration console, add a custom SAML 2.0 application and name it clearly, for example “Jenkins Production” and “Jenkins Staging” as two separate entries.

2

Register the Service Provider identity

Provide the Jenkins Entity ID and the Assertion Consumer Service address. The easiest and least error-prone way is to import the Jenkins SP metadata document, if the IdP supports importing it.

3

Choose the NameID format and value

Select what the NameID will carry, aligned with the username decision from the planning chapter. Persistent identifiers or email addresses are the most common choices.

4

Release the attributes Jenkins needs

Map directory fields to SAML attributes: display name, email and the group list. Give the attributes simple, stable names, because Jenkins will look them up by exactly that name.

5

Decide how groups are sent

Many IdPs can send all groups a person belongs to, or only those that match a filter. Sending only the Jenkins-related groups keeps the assertion small and avoids leaking unrelated organisational information into an application that does not need it.

6

Assign people and groups to the application

Most IdPs refuse to sign in users who are not assigned to the application. Assign the pilot group first. This is your first line of defence, because a person who is not assigned cannot even reach Jenkins.

7

Export the IdP metadata

Copy the metadata web address or download the metadata document. This is what you will hand to Jenkins in the next chapter.

Vendor flavours at a glance

IdPWhere to lookTypical thing to watch
OktaApplications, create a SAML 2.0 integrationGroup attribute statements use filters; a wrong filter silently sends no groups
Microsoft Entra IDEnterprise applications, non-gallery application, single sign-onGroup claims may arrive as object identifiers rather than readable names unless configured
KeycloakClients of type SAML in a realmMappers must be added explicitly for roles and groups
Active Directory Federation ServicesRelying party trusts with claim rulesClaim rules must transform directory groups into the outgoing group attribute
Ping IdentitySP connections with attribute contractsAttribute contract names must match Jenkins settings exactly
!
Group name surprise

With some IdPs, group memberships are sent as long unique identifiers instead of friendly names. Jenkins will happily accept them, but your permission rules then need those long identifiers. Decide on friendly names or identifiers deliberately, and document the mapping.

10Configuring the Jenkins Side

With the IdP ready, we can switch Jenkins over. The safest approach is deliberate, ordered and reversible.

1

Take a backup first

Back up the Jenkins home directory, especially the main configuration file. This backup is your undo button if something unexpected happens.

2

Install and verify the plugin

Use the plugin manager to install the SAML plugin, restart if requested, and confirm on the plugin list that it and its dependencies loaded without warnings.

3

Verify the Jenkins URL

In the system settings, confirm that the Jenkins URL is the public HTTPS address. A mismatch here is the number one hidden cause of callback failures.

4

Prepare your administrator group before switching

Make sure the authorization strategy already contains a rule that grants full control to the IdP group that will contain your administrators. If you flip the realm first and configure permissions afterwards, you may sign in successfully and still have no rights to fix anything.

5

Select the SAML security realm

In global security settings, choose SAML 2.0 as the security realm. Provide the IdP metadata, ideally as a web address so that certificate updates are picked up automatically.

6

Fill in the attribute names

Enter the exact attribute names for display name, email, groups and username, as released by the IdP. Spelling and letter case must match exactly.

7

Set lifetime and logout behaviour

Choose a maximum authentication lifetime that respects company policy, and set the logout redirect so people land on a sensible page after signing out.

8

Exchange metadata and test in a private window

Give the generated Jenkins SP metadata to the IdP team if not already done, then keep your current administrator session open in one browser and test the login in a separate private window. The open session is your safety net while you test.

9

Validate identity, groups and permissions

After a successful login, open your user page to confirm the display name, email and, most importantly, the list of authorities that Jenkins received. If the group list is empty, stop and fix the IdP attribute release before letting anyone else in.

Simple Analogy

Changing the login method on a live Jenkins is like changing the lock on the front door while people are inside. You keep one person standing in the doorway with the old key until you have confirmed the new lock opens for the right people and stays locked for everyone else.

i
Change window

Schedule the switch outside peak build hours, announce it, and keep the person who owns the IdP on a call. Most problems are attribute or URL mismatches that take two minutes to fix when both sides are in the same conversation.

11Groups, Attributes and Authorization Mapping

This is the chapter where SSO becomes useful. Authentication gets people in the door; group mapping decides which rooms they can enter.

How a group becomes a permission

When Jenkins reads the group attribute from the assertion, it turns every value into an authority attached to that person for the length of the session. The authorization strategy then treats each authority like a named group. A rule that says “grant read access to the group build-viewers” will match any person whose assertion contained the value build-viewers. The match is by exact text, including letter case, so the names must be identical on both sides.

flowchart TD
    A["Directory Group: jenkins-admins"] --> B["IdP releases group attribute"]
    C["Directory Group: team-payments-dev"] --> B
    D["Directory Group: build-viewers"] --> B
    B --> E["Signed SAML Assertion"]
    E --> F["Jenkins SAML Plugin reads authorities"]
    F --> G["Global Matrix: admins get full control"]
    F --> H["Role Strategy: developers get job build and read"]
    F --> I["Folder Permissions: team sees only own folder"]
        
FIG 3 — From directory group to Jenkins permission

Choosing an authorization strategy

StrategyHow it worksBest for
Logged-in users can do anythingAny authenticated person has full powerSmall private labs only. Never appropriate for a shared production controller
Matrix-based securityA global grid of permissions by user or groupSmall and medium teams with a few clear roles
Project-based matrix securityAdds per-job permission grids on top of the global gridTeams that need job-level exceptions
Role-based strategy pluginDefines named roles with pattern-based scopes, then assigns groups to rolesLarger organisations with many teams and jobs
Folder-scoped permissionsPermissions granted inside a folder and inherited by contained jobsMulti-team controllers that want team isolation

A sound group model

Administrators

A very small group with full control. Membership should require approval and be reviewed regularly. Keep it small enough that every member is known by name.

Team developers

One group per team, allowed to read, build and configure jobs in that team’s own folder only. This isolates teams from each other and limits the blast radius of a mistake.

Release managers

A cross-team group allowed to run promotion or production deployment jobs, ideally with an extra approval step inside the pipeline itself.

Read-only viewers

A broad group for managers, auditors and support engineers who need to see build status but must never change anything.

!
Least privilege

Start with the minimum access for every group and add rights when a real need appears. It is far easier to grant one more permission on request than to discover, after an incident, that everyone had permission to delete jobs or read credentials.

Group changes are not instant

Group memberships arrive inside the assertion at login time. If someone is added to or removed from a group, Jenkins learns about it only at that person’s next login. A removed person with an active Jenkins session keeps the old rights until the session ends or the maximum authentication lifetime expires. This is why the lifetime setting is a real security control and not just a convenience setting.

12Sessions, Lifetimes and Logout

A login is only the start of the story. What happens over the next hours, and at logout, decides how safe the integration really is.

Two sessions, not one

After a successful login there are actually two separate sessions. The IdP has its own session with the browser, which is what makes the next application login feel instant. Jenkins has a second, independent session of its own. Ending one does not automatically end the other, and that gap is the source of many surprises.

Session

IdP session

Controlled by the company identity system. It decides whether the person must type a password or answer a multi-factor prompt again.

Session

Jenkins session

Controlled by Jenkins and the plugin. It decides how long a person stays signed in to Jenkins itself, and how long old group memberships remain in effect.

What logout really does

When a person clicks log out in Jenkins, Jenkins ends its own session. Whether the IdP session also ends depends on configuration. If it does not, the very next click on a Jenkins link will silently sign the person back in, which confuses users into thinking logout is broken. The fix is to send people to the IdP logout page after Jenkins logout, or to accept and explain the behaviour. Full single logout, where one logout propagates to every application, is part of the standard but is harder to make reliable, so many organisations rely on short session lifetimes instead.

Simple Analogy

Handing back the room key at one hotel room does not make the front desk forget who you are. If you walk back into the lobby, the desk instantly issues another key. Real logout means telling the front desk as well.

Choosing the right lifetime

A short maximum lifetime forces frequent re-authentication and quickly reflects group changes, but it annoys people who keep a Jenkins dashboard open all day. A very long lifetime is comfortable but keeps stale permissions alive. A typical balanced choice for engineering teams is one working day, with sensitive controllers using shorter values. Whatever you choose, make sure it matches the session policy that the security team applies at the IdP, so that people do not experience two different clocks.

i
Force fresh login for sensitive work

Some IdPs and the plugin allow requesting a fresh authentication, ignoring the existing IdP session. This can be useful for a dedicated controller that guards production releases, where you want a real multi-factor check every time.

13Automation, API Tokens and Non-Browser Access

SAML is designed for humans with browsers. Yet a large part of Jenkins traffic is not human at all.

Who talks to Jenkins without a browser

Machine

Build agents

Worker machines that connect back to the controller to run jobs. They authenticate with their own secret or by the connection method you configured, not through SAML.

Machine

Source control webhooks

Git servers notify Jenkins when code changes. These calls use dedicated hook endpoints and secrets, not user logins.

Machine

Scripts and command line tools

Administrators and other systems call the remote API or use the command-line client to trigger and inspect jobs.

Machine

Other platforms

Chat bots, dashboards and release tools that read build status or trigger builds on behalf of a team.

How API tokens fit in

After a person has signed in through SAML at least once, they can create personal API tokens from their own user page. A token is a long random secret that stands in for the person when calling the Jenkins API. It carries exactly the permissions that the person’s groups grant, so a viewer’s token can only view. Tokens can be named, listed and revoked individually, which is much safer than sharing a password.

!
Tokens outlive group changes

A token belongs to the Jenkins user record. If the person leaves the company and the IdP account is disabled, they can no longer sign in through SAML, but a token that already exists may still work until it is revoked or the user record is removed. Include token cleanup in your offboarding process and consider periodic reviews of stale tokens.

Service identities

For shared automation, do not borrow a real person’s token. Create a dedicated service account in the IdP, give it its own narrowly scoped group, sign in once so Jenkins creates the user record, and issue the token from that record. When the automation owner changes, the token remains valid, and the audit trail clearly shows that actions came from a machine.

ANTI-PATTERN-01 Avoid
Problem

A team lead generates an API token from their own account and hands it to the deployment pipeline of the whole department.

Why It’s Harmful

The token carries the lead’s full permissions, hides machine actions behind a human name and breaks the day the lead changes teams or leaves the company.

Correct Approach

Use a dedicated service account with its own least-privilege group, and store its token in a proper secret manager with an owner and a rotation date.

14Security Hardening

SAML gives you a strong foundation, but a foundation is not a finished building. These are the areas where careful teams add extra protection.

Transport

HTTPS everywhere

Serve Jenkins only over HTTPS with a valid certificate and redirect any plain HTTP request. Session cookies and assertions must never travel unprotected.

Trust

Trust one IdP only

Configure exactly one trusted issuer and one metadata source. Do not paste certificates from unknown sources, and always verify metadata fingerprints over a separate channel.

Signing

Signed and, if needed, encrypted

Require signed assertions. For high-sensitivity environments, also ask the IdP to encrypt assertions so that group lists and personal data are unreadable to the browser courier.

Time

Tight clock tolerance

Keep server clocks accurate with a time service and avoid large tolerance values. A wide tolerance widens the window in which a captured assertion might be replayed.

Flow

Prefer SP-initiated login

Where possible, disable IdP-initiated login so every assertion answers a request that Jenkins itself made and remembers.

MFA

Enforce multi-factor at the IdP

Because Jenkins trusts the IdP completely, the strength of your Jenkins login is exactly the strength of your IdP policy. Require multi-factor authentication for the Jenkins application.

Reverse proxies and load balancers

Most production Jenkins servers sit behind a reverse proxy or a load balancer that terminates HTTPS. If the proxy does not pass the original host name and protocol to Jenkins, Jenkins may build a callback address with the wrong scheme or host, and the IdP will refuse to return the user there. Make sure the proxy forwards the standard forwarded headers, and confirm that Jenkins shows no reverse proxy warning on its administrative monitors.

Other Jenkins protections that still apply

SAML does not replace the rest of Jenkins security. Keep cross-site request forgery protection enabled, limit which agents can run builds on the controller, restrict script console access to a tiny administrator group, and manage credentials through the credentials system with folder-level scoping. An attacker who cannot log in can still hurt you through an exposed script console or a leaked token, so treat identity as one layer among several.

i
Segregate high-value controllers

For production deployments, consider a separate controller with a smaller administrator group, shorter session lifetime and forced fresh authentication. Not every Jenkins deserves the same trust level just because they share one company login.

15Monitoring, Logging and Auditing

An SSO integration that nobody watches is a time bomb. A few well-chosen signals turn surprises into scheduled work.

What to record

Log

Login successes and failures

Jenkins logs authentication events. Forward them to a central logging platform so that failed logins, unusual hours and new users are searchable.

Log

IdP sign-in logs

The IdP records who signed in to the Jenkins application, from which device and with which multi-factor result. These logs are richer than anything Jenkins keeps.

Log

Configuration changes

Use an audit trail plugin or configuration-as-code history to track who changed the security realm or permission rules, and when.

Metric

Certificate expiry

Track the days left before the IdP signing certificate expires, and alert well before that date.

Useful health signals

Login rate
sudden drops point to an IdP or plugin problem
Failure ratio
spikes can mean attribute changes or attacks
Cert days left
alerts at 60, 30 and 7 days

Auditing who can do what

Schedule a periodic access review, for example quarterly. Export the members of each Jenkins-related IdP group and ask each group owner to confirm every name. Compare the administrator group against the list of people who actually need it. Reviews sound tedious, yet they are among the cheapest and most effective controls, and auditors specifically ask for evidence of them.

Connecting a login to a build

Because every user is a named identity, build history shows exactly who started or approved each job. This makes it possible to answer questions such as who triggered the release that failed at midnight, using nothing more than the normal Jenkins build page and the central logs.

16Troubleshooting Failed Logins

When SAML breaks it feels mysterious, but the failure almost always falls into a short list of categories. A calm, structured approach finds it quickly.

flowchart TD
    A["Login fails"] --> B{"Does the browser reach the IdP login page?"}
    B -->|"No"| C["Check Jenkins URL, SP Entity ID, IdP endpoint in metadata"]
    B -->|"Yes"| D{"Does the browser return to Jenkins?"}
    D -->|"No"| E["Check ACS address registered at IdP, proxy headers, HTTPS"]
    D -->|"Yes, with error"| F{"What does the Jenkins log say?"}
    F -->|"Signature problem"| G["Certificate rotated or wrong metadata"]
    F -->|"Time problem"| H["Clock drift between servers"]
    F -->|"Audience problem"| I["Entity ID mismatch"]
    D -->|"Yes, but no rights"| J["Group attribute name, values or IdP release wrong"]
        
FIG 4 — A simple decision tree for SAML login problems
SymptomLikely causeWhere to look
Redirect loop between Jenkins and IdPCallback address mismatch or cookies blocked by a wrong proxy schemeJenkins URL setting, proxy forwarded headers, browser developer tools
Everyone fails at the same time, suddenlyIdP signing certificate rotatedIdP metadata, plugin metadata refresh, Jenkins log signature errors
Login works but user has no permissionsGroup attribute name differs or groups not releasedUser page authorities, IdP attribute statement
Some people work, others do notMissing application assignment or group filter excluding themIdP application assignments and group filters
Duplicate users with slightly different namesUsername attribute or case handling changedUsers list, username attribute and case setting
Error mentioning audience or recipientEntity ID or ACS address differs on the two sidesSP metadata vs IdP application definition
Error mentioning validity timeClock drift on Jenkins or IdP hostTime synchronisation on the Jenkins server
Logout brings the person straight back inIdP session still activeLogout URL and IdP logout behaviour

Useful debugging habits

Capture the actual assertion using a browser extension or the developer tools network tab in a test account, and inspect which attribute names and values it contains. Raise the Jenkins log level for the SAML plugin temporarily, reproduce the failure once, then turn the level back down so logs do not fill the disk or expose personal data. Treat captured assertions as sensitive, because they may contain personal information.

!
Do not debug by weakening security

Under pressure it is tempting to disable signature validation or widen time tolerance “just to test”. That habit turns a temporary experiment into a permanent hole when someone forgets to revert it. Find the real cause instead.

17Design Patterns and Anti-Patterns

Teams that have run SSO for years tend to converge on the same good habits and repeat the same mistakes. Learning both saves you time.

Patterns that work

Group-only permissions

Grant every permission to groups, never to individual users. When someone changes teams, only their directory group membership changes, and Jenkins follows automatically at the next login.

Configuration as code

Store the security realm and authorization settings in a version-controlled configuration file managed with the Jenkins Configuration as Code approach. Changes get reviewed, and a rebuilt controller comes back with the same security posture.

Staging mirror

Maintain a staging Jenkins registered as a separate IdP application. Rehearse plugin upgrades, certificate rotations and group changes there first.

Metadata by address

Point Jenkins at the IdP metadata web address so that legitimate certificate rotations are absorbed automatically instead of causing an outage.

ANTI-PATTERN-02 Avoid
Problem

The team switches the security realm to SAML on production without preparing an administrator group or a rescue path.

Why It’s Harmful

The first successful login belongs to a person with no rights, nobody can repair the configuration from the web interface, and the only way back is emergency server access in the middle of an outage.

Correct Approach

Pre-authorise an administrator group, keep a tested and documented recovery procedure, and keep one admin session open during the change.

ANTI-PATTERN-03 Avoid
Problem

Permissions are assigned to individual email addresses inside Jenkins, and the IdP sends every group a person belongs to.

Why It’s Harmful

Nobody can review who has what without opening Jenkins, name changes orphan permissions, and oversized assertions leak unrelated group names to a tool that does not need them.

Correct Approach

Send only the small set of Jenkins-relevant groups, grant permissions only to those groups, and manage membership at the IdP.

ANTI-PATTERN-04 Avoid
Problem

The IdP signing certificate is pasted into Jenkins once as static text, and nobody records its expiry date.

Why It’s Harmful

On the day the IdP rotates its key, every login fails simultaneously, usually early in the morning, and the cause is not obvious to the on-call engineer.

Correct Approach

Use the metadata address, track certificate expiry in monitoring, and rehearse rotation in staging.

18Scale, Availability and Recovery

A single Jenkins with SAML is simple. A company with many controllers, an outage plan and a disaster recovery drill needs a little more thinking.

Many controllers, one identity provider

Large organisations often run dozens of Jenkins controllers, one per business unit or environment. Each controller is a separate service provider with its own Entity ID and its own callback address, and each must be registered at the IdP. Automating this registration through the IdP’s administrative interface, or using a shared template, prevents mistakes such as two controllers accidentally sharing an identifier, which can cause assertions to be accepted by the wrong system.

flowchart LR
    IDP["Company Identity Provider"] --> J1["Jenkins Team A"]
    IDP --> J2["Jenkins Team B"]
    IDP --> J3["Jenkins Release"]
    IDP --> J4["Jenkins Staging"]
    G["Directory Groups"] --> IDP
    M["Central Logs and Alerts"] -.-> IDP
    M -.-> J1
    M -.-> J2
    M -.-> J3
        
FIG 5 — One identity provider serving many Jenkins controllers

Availability: what if the IdP is down?

Because Jenkins trusts the IdP for every new login, an IdP outage means nobody can start a fresh session. People who are already signed in continue to work until their sessions expire, and builds that are already scheduled keep running, since machine-to-machine traffic uses tokens. To limit the impact, use an IdP with a strong availability record, keep session lifetimes reasonable so that short outages are absorbed, and have a documented emergency procedure for administrators.

The break-glass procedure

Every SSO design needs a controlled way in when SSO itself fails. In Jenkins, the typical last resort is for a server administrator with access to the machine to temporarily change the security setting stored in the Jenkins home directory back to a simple mode, restart, repair the problem, and then restore the SAML configuration. This is powerful and dangerous, so restrict who holds server access, log every use, and rehearse it in staging so that nobody performs it for the first time during a real crisis.

!
Never leave the door open

A break-glass procedure that leaves Jenkins with no security after the emergency is worse than the outage. Write the “restore security” step into the same runbook, and require a second person to confirm it was done.

Backup and restore

Back up the Jenkins home directory regularly and remember that it contains the identity configuration. After a restore, verify that the IdP metadata and the Jenkins URL are still correct for the environment you restored into. A restored production backup placed on a test machine, for example, will still try to send people to the production callback address.

19SAML, OpenID Connect and Other Options

SAML is not the only way to connect Jenkins to a central login. Understanding the alternatives helps you justify your choice.

OptionHow it worksStrengthsTrade-offs
SAML 2.0XML assertions signed by the IdP, carried by the browserVery widely supported in enterprises, rich attributes, mature security review practicesXML complexity, certificate management, harder to debug
OpenID ConnectJSON tokens built on top of OAuth 2.0Simpler to reason about, modern tooling, easier for developersGroup claims vary by provider, plugin behaviour differs
LDAP or Active Directory directJenkins checks a username and password against the directoryFamiliar, no browser redirectJenkins handles passwords, no true single sign-on, harder to enforce multi-factor
Reverse proxy authenticationA proxy in front of Jenkins authenticates and passes identity headersCentralises access in front of many toolsTrust depends on the proxy; header spoofing must be prevented
Built-in Jenkins usersJenkins stores its own accountsTrivial to set upNo central policy, weak offboarding, not suitable for companies

When SAML is the right choice

SAML is a very strong fit when your organisation already standardised on it for other business applications, when your identity team has existing SAML operational skills, when the IdP is a large enterprise product with mature SAML support, or when audit requirements mention it explicitly. If the same team is choosing greenfield technology and every tool in the company already speaks OpenID Connect, that option may reduce maintenance effort. Both are legitimate; the important thing is that Jenkins joins the same central login as everything else.

“The best SSO protocol is the one your identity team can operate calmly at three in the morning.”

20Real-World Examples

The following stories are composites of patterns that repeat across the industry. They show how the ideas of this guide play out in practice.

A bank consolidating dozens of controllers

A large financial institution discovered that every project team had spun up its own Jenkins with local users. During a compliance review it could not prove who had access to build systems that touched payment code. The company moved every controller to its corporate IdP, defined a small set of standard groups, and gained a single report of everyone with administrative rights. Offboarding time for build system access dropped from weeks to the same day as HR termination.

A software product company with multi-team isolation

A growing product company placed each team’s pipelines in their own folder on a shared controller and mapped each team’s directory group to permissions only inside that folder. Developers gained autonomy for their own jobs, and they could no longer see or edit another team’s credentials. When teams reorganised, the platform team changed group membership in the directory and Jenkins followed without any configuration edit.

An outage caused by certificate rotation

An e-commerce company suffered a morning-long Jenkins login outage when the IdP rotated its signing certificate and the old certificate was still pasted as static text. Nothing was wrong with Jenkins, and yet nobody could sign in. Afterwards they switched to a metadata address, added certificate expiry alerts, and wrote a rotation runbook that was rehearsed in staging.

A healthcare technology firm with regulated releases

A regulated company needed evidence for every production release: who started it and who approved it. With SSO, every action was attached to a named corporate identity with mandatory multi-factor sign-in. They dedicated a separate release controller with a small approver group and short session lifetimes, and exported the audit trail for their regular compliance evidence.

Faster
offboarding, tied to the HR process
Clearer
audit trail for every build and release
Safer
because MFA and policies come from one place

21Advantages, Trade-offs and Best Practices

Every design decision has a cost. Knowing the honest trade-offs lets you defend your choices to both engineers and auditors.

Advantages

  • One central place for passwords, multi-factor policy and account lifecycle
  • Immediate removal of access when a person leaves the company
  • Consistent, auditable identity attached to every build action
  • Group-driven permissions that follow organisational changes
  • Fewer passwords to remember, which lowers help desk load
  • Familiar login experience shared with all other company tools

Disadvantages / Trade-offs

  • Jenkins now depends on the IdP for every new login
  • Certificate rotation and attribute changes must be coordinated between two teams
  • Debugging XML-based flows is harder than debugging a simple password check
  • Group changes reach Jenkins only at next login
  • Automation still needs a separate token strategy
  • The plugin becomes a critical security component to patch promptly

Best practices at a glance

Practice 1

Pilot before production

Register a staging controller, rehearse the whole rollout and only then touch production.

Practice 2

Pre-authorise administrators

Grant the IdP admin group full control before switching the security realm.

Practice 3

Permissions to groups only

Keep individual usernames out of permission rules entirely.

Practice 4

Stable usernames

Choose an identifier that never changes and never gets reused.

Practice 5

Metadata by address and expiry alerts

Let rotations flow in automatically and be warned long before certificates expire.

Practice 6

Service accounts for automation

Never borrow a human’s token for shared pipelines.

Practice 7

Document the break-glass path

Write it, rehearse it and require a second person to confirm restoration of security.

Practice 8

Review access regularly

Hold quarterly reviews of group members, administrators and stale tokens.

Common mistakes to remember

!
Top mistakes

Wrong Jenkins URL behind a proxy, mismatched attribute names or letter case, forgetting the admin group before switching, tolerating an unknown certificate expiry date, letting people share tokens, and testing only with an administrator account so that nobody notices that ordinary users receive no groups.

22Frequently Asked Questions

Q1Does SAML remove the need for Jenkins permissions?

No. SAML answers who the person is and, optionally, which groups they belong to. Jenkins still needs an authorization strategy to convert those groups into permissions on jobs, agents and settings.

Q2Can I keep some local Jenkins users next to SAML?

With the SAML realm active, the login screen goes through the IdP, so a parallel local password list is not the normal model. Give service automation its own identities at the IdP and use API tokens, and rely on the documented break-glass procedure for emergencies.

Q3Why does my new colleague see “access denied” after a successful login?

Authentication worked, but authorization did not. Most often the group attribute is empty, named differently from what Jenkins expects, or the person has not been added to the IdP group that Jenkins maps to a permission. Check the authorities on their user page.

Q4Why did I lose access to my old jobs after we changed the username attribute?

Jenkins treats the username as the identity key. A different value means a different user, with none of the old tokens, permissions rules tied to that name or personal settings. Decide the username attribute once and keep it.

Q5Do build agents need SAML?

No. Agents connect to the controller through their own connection mechanism and secret. SAML is only for people signing in through a browser.

Q6Is it safe to disable signature checking to speed up testing?

No. Without signature validation anyone able to craft a message could claim to be an administrator. Fix the real mismatch instead of weakening the control.

Q7How quickly does a group change take effect?

At the person’s next SAML login. An active session keeps the old rights until it ends or the maximum authentication lifetime runs out, so set that lifetime deliberately.

Q8What happens to API tokens when someone leaves?

The person can no longer sign in, but tokens on their user record may still work until revoked or the user is removed. Include token cleanup in offboarding and review stale tokens periodically.

Q9Do I need to encrypt assertions?

Signing is essential; encryption is optional and worthwhile when assertions carry sensitive attributes or when policy requires it. Over HTTPS the assertion is already protected in transit, but encryption also hides it from the browser and any tools running there.

Q10Can one Jenkins trust two identity providers?

A single controller normally has one security realm and therefore one IdP. Organisations with several identity sources usually federate them behind one central IdP or broker, and let Jenkins trust only that one.

Q11What is the safest way to roll this out?

Rehearse on a staging controller, pre-authorise an administrator group, keep an admin session open during the switch, test as an ordinary non-admin user, and have the IdP owner available during the change window.

23Summary and Key Takeaways

Integrating Jenkins with SSO through SAML 2.0 means moving the question “who are you?” out of the build server and into the one system that is designed to answer it well. Jenkins keeps ownership of what people may do, using groups delivered by the IdP. When the design is careful, with stable usernames, group-only permissions, a staging rehearsal, monitored certificates, proper service identities and a rehearsed emergency path, the result is a build platform that is easier to use, easier to audit and much harder to misuse. The technology is only half of the work; the other half is the collaboration between the Jenkins platform team and the identity team.

Key Takeaways

  • SAML handles authentication, Jenkins handles authorization — the IdP proves identity and sends groups, while the Jenkins authorization strategy turns those groups into permissions.
  • Trust is built on signatures and metadata — Jenkins trusts the assertion only because of the certificate exchanged in metadata, so certificate rotation must be monitored and automated.
  • Plan usernames and groups before you configure anything — a stable username attribute and a small set of role-based groups prevent most long-term pain.
  • Prepare the administrator group and a break-glass path first — never switch the security realm without both, and always keep an existing admin session open while testing.
  • Machines need their own path — use dedicated service accounts and API tokens for automation, and include token cleanup in offboarding.
  • Sessions and lifetimes are security controls — group changes reach Jenkins only at login, so align the maximum authentication lifetime with company policy.
  • Operate it like a production service — monitor logins and certificate expiry, review group membership regularly, patch the plugin promptly, and rehearse changes in staging.