Registering Conduit with your provider
Create a web application OIDC client in your provider with a client secret. Each Conduit provider has its own redirect URI:CONDUIT_BASE_URL, which must be the address users
actually reach — the provider redirects the browser there, so a mismatch
breaks sign-in.
Then add the provider in Conduit under Settings → Sign-in: instance admins
add instance providers there, and workspace admins add their workspace’s
providers (see Instance sign-in vs. workspace SSO).
Presets for Google, GitHub, Microsoft, and Okta prefill the issuer and
scopes; Custom OIDC covers any other compliant provider. You supply:
- Issuer URL — Conduit discovers the authorization, token, and JWKS
endpoints from
<issuer>/.well-known/openid-configuration. Providers without discovery can be configured with explicit authorization and token URLs instead. - Client ID and secret — the secret is write-only: no API response ever returns it, and it is stored encrypted. Editing a provider keeps the stored secret unless you change the client ID, issuer URL, or token URL; those changes need the secret re-entered.
- Scopes — editable per provider; the default is
openid email profile. Add your provider’s groups scope (e.g.groups) if you use group claims in provisioning rules. - Request fresh sign-in — available for Okta, Microsoft, and Custom OIDC; on by default. Asks the provider to authenticate users again each time Conduit starts a sign-in. Turn it off to let the provider reuse an existing session. The provider can still require sign-in or MFA according to its own policy.
prompt=login parameter;
when off, it omits prompt. Turning it off does not request silent sign-in
(prompt=none). It is useful when a provider cannot satisfy a fresh-authentication
request through every sign-in method it supports.
The Google and GitHub presets always omit prompt, including for existing
configurations. They do not expose this setting because neither documents
support for prompt=login.
Each provider also carries an optional access-denied message: admin-written
help shown to a user whose sign-in the provider refused (typically someone
not assigned to the app in the IdP). Write it for the person staring at the
error — “Request access to Conduit in the IT portal”, with a link. It’s
public: the login page (and a workspace provider’s workspace login page) shows
it next to the provider’s button before anyone signs in.
What Conduit reads from your provider
Conduit reads identity claims from the ID token — never from the provider’s access token. This has practical consequences worth knowing before you file a ticket with your identity team:- No custom authorization server or access-token audience is needed. Your provider’s default/organization authorization server works as-is, because Conduit never inspects the access token or calls it against your APIs.
subis stored exactly as your provider asserts it. Identities are keyed by (provider, subject) — never by email — so an email change in the directory follows the same person rather than creating a new one, and no claim-mapping logic is required on the provider side.emailandemail_verifiedname the account. Sign-in follows the directory when the address changes.name, orgiven_nameandfamily_namewhennameis absent, is the person’s display name. With neither, Conduit uses the part of the email address before the@(dylan.sather@company.combecomes “dylan.sather”) and replaces it the first time a sign-in asserts a name. A name set in Conduit or asserted earlier by a provider is kept.- A groups claim, when your provider includes one in the ID token, is available to provisioning rules — “members of directory group X land in Conduit group Y” — and is evaluated on every sign-in.
CONDUIT_LOG_LEVEL=debug and sign in; the
verified claims are logged at debug level.
Signing in through SSO is what provisions an account: the first sign-in
creates the user, later sign-ins follow email changes from the directory. To
provision users before they sign in — and deprovision them when they leave —
pair SSO with SCIM.
Instance sign-in vs. workspace SSO
Providers exist at two scopes, and the difference is who manages them and how users reach them:- Instance providers (Settings → Sign-in, instance admins) appear as buttons on the login page. In a single-workspace deployment they are the only providers, and the same page carries the workspace settings that apply there: each provider’s Domains action (below), the Domains list, and Ask members to sign in again.
- Workspace providers (Settings → Sign-in, workspace admins) belong to one workspace and never appear as buttons on the main login page. People reach them through the workspace’s own login page, or by home-realm discovery: a user types their email address, and its domain routes them to their workspace’s provider. Signing in through a workspace provider also grants membership in that workspace automatically.
The main login page
In a multi-workspace deployment the main login page shows the instance providers’ buttons, then an email field with Continue with email. An email at a domain a workspace has verified, with a provider chosen for it, goes straight to that provider with the address already filled in, and the session starts in that workspace. Any other email reveals the password field. With password sign-in off, the page says so and points at the provider buttons instead. A routed email is offered the password field only when its provider can’t be reached. The lookup behind Continue with email only says whether a domain routes, never whether an account exists, and it’s throttled per IP. A single-workspace deployment’s login page asks for the email and password together. Because a routed email gets no password field while its provider works, keep the break-glass account (CONDUIT_ADMIN_EMAIL) at an address no workspace
verifies, such as the default admin@localhost.
Once Continue with email reveals the password field, the page shows only the email
and password, with Sign in another way at the top right of the sign-in box
to bring back everything else. The login page also leads with the method a
browser last signed in with: the email and password fields, that one
provider’s button, or the email step for a workspace’s provider. Sign in another way shows the
full page and forgets the choice. The browser remembers only the method, never
the email address or the workspace, since anyone at the machine can see the
login page.
The workspace login page
In a multi-workspace deployment, a workspace has a login page at/login/<workspace-id>, where <workspace-id> is the same id as in the
workspace’s MCP URL (/mcp/<workspace-id>). It shows the
workspace’s name, logo and the sign-in methods it accepts (see below): its
own providers, the instance providers it accepts, then email and password
fields when it accepts them. It doesn’t ask for the email first, since it
already knows the workspace. Sign in another way at the top right of the
sign-in box leads to the main login page.
When the workspace has exactly one provider of its own, the page goes straight
to it; its other methods are there when the person comes back. A workspace with
no provider of its own does the same for an instance provider when that is the
only method it accepts. It does this once per browser tab: signing out, or coming
back after the provider refused the sign-in, shows the page in that tab
instead of starting the provider again, and a new tab starts it again. A
refused sign-in’s error page links back to the workspace login page. A
workspace left with nothing to offer says so, and its owners sign in another
way to fix it.
Its address is under Login page on Settings → Sign-in. Share it with
your members: it works before any domain is verified. A sign-in from it starts
the session in that workspace for anyone who belongs to it, and someone already
signed in who opens it goes on in that workspace. The page is public: anyone
with the workspace’s id, which is in its MCP URL, can see the workspace’s
name, logo and the sign-in methods it accepts. The id can’t be guessed, and an
unknown one answers as if no such workspace existed.
When an MCP client or the CLI asks you to approve it, the approval screen
names any workspace that doesn’t accept how your browser signed in, since the
client would be refused there too, and offers to sign in to it again first.
Home-realm discovery runs on the workspace’s email domains, under
Domains on the same page. Add a domain, then prove your organization owns
it: Conduit issues a DNS challenge, you publish it as a TXT record —
Who joins through a workspace provider
Signing in through a workspace provider makes someone a member of the workspace only when the provider confirms their email (email_verified) and
it is at one of the provider’s Domains, the domains that sign in with that
provider (one added there joins the workspace’s Domains, unverified). The
domains don’t need to be verified for this, so joining works as soon as you
add them, without a DNS record, and you can list a partner’s domain you
don’t own. Public email services such as gmail.com can’t be listed, so a
provider like Google lets in only the accounts at your domains, not anyone
with a Google account.
At a domain you’ve verified, the person joins as they sign in. At one you
haven’t, they’re asked first: the sign-in ends on a Join Acme? page, and
they become a member only if they choose to. Any workspace can list a domain
without proving it owns it, so this keeps a workspace from making someone a
member without their knowing; verifying the domain skips the question. The
question stays open for 7 days, and a later sign-in asks again.
A provider that doesn’t send email_verified at all, such as Microsoft Entra
ID, is trusted only for the domains you’ve verified: its people join once
their domain is verified.
Anyone else the provider authenticates gets in only with an account it
already signs in: one SCIM provisioned, or one that signed in through it
before. Everyone else is refused before Conduit creates an account for them,
and the refusal appears in the workspace’s audit log as a failed sign-in with
the reason: an address outside the provider’s domains, or one the provider
didn’t confirm. Someone outside those domains, such as a contractor, joins
through SCIM or through their domain listed on the provider. Removing a
domain changes who joins from then on; members who joined through it stay
members until you remove them.
A workspace provider needs at least one domain, when you add it and after:
Conduit refuses a change that would leave it with none.
The provider dialog checks what the provider publishes about itself (the
claims_supported list in its OIDC discovery document). If the provider
lists its claims without email_verified, it never confirms addresses, and
the dialog warns that only people at a domain you’ve verified join through
it. If it publishes no list, the dialog notes the same may apply.
Which sign-in methods a workspace accepts
Settings → Sign-in → Sign-in methods lists every way to sign in to the workspace, each with a switch (the API isGetWorkspaceSignInPolicy,
UpdateWorkspaceSignInPolicy, and UpdateWorkspaceInstanceProvider for one
instance provider):
- The workspace’s own providers are accepted while they’re enabled.
- The instance’s providers and email and password are switched on or off for the workspace. A workspace with all of them on accepts an instance provider added later too; once any is off, a new instance provider starts off there. Email and password can only be on while the instance offers password sign-in.
- Ask members to sign in again makes a sign-in older than 1, 7 or 30 days stop letting members into the workspace.
The sign-in policy
Alongside the providers sits the instance-wide sign-in policy — which methods exist at all. Instance admins manage it through the API or theget_auth_policy and update_auth_policy built-in admin tools:
- Password sign-in can be disabled entirely once SSO works, leaving your identity provider as the only way in. There is deliberately no open self-service sign-up, email verification, or password-reset flow to disable alongside it: accounts come from the first-run wizard, SSO, SCIM, or an invite (which creates a password account only while password sign-in is on), and password recovery for the operator is the break-glass credential below. Turning password sign-in off signs out everyone who signed in by password, in the web app and in MCP clients, except instance admins (the break-glass credential is a password sign-in); turning it back on revives none of those sign-ins.
- Workspace creation can be limited to instance admins, and personal workspaces (a workspace of one’s own for each new user, in multi-workspace deployments) can be switched off.
Break-glass access
If SSO misconfiguration ever locks everyone out, the bootstrap credential is the recovery path: with bothCONDUIT_ADMIN_EMAIL and
CONDUIT_ADMIN_PASSWORD set in the environment, the bootstrap admin can
always sign in with them, without touching the stored password. The login
page keeps its email and password fields visible while the credential is
configured, even with password sign-in disabled by policy, so there is
always somewhere to type it — and the instance Sign-in settings show a
warning in that state, reminding you to restart without the variables once
recovery is done. See the
configuration reference. Leave both unset in
normal operation.
Each user can own one workspace. Workspaces they join as a member do not count
toward that limit, and instance admins are not limited.
How SSO threads through MCP and the CLI
Nothing extra to configure — but useful to understand when reviewing the flows:- An AI client connecting to
/mcpgoes through Conduit’s own OAuth flow: the browser window it opens is the same login page, SSO included. Your provider authenticates the human mid-flow; the token the client ends up holding is issued by Conduit, and your provider’s tokens are never given to the client. - The Conduit CLI’s
conduit loginshows a short code to approve in the browser — again the same login page and providers. The CLI setup UI is feature-flagged and hidden by default.