Wednesday, April 15
A deep-dive companion to the Sierra Staff and Single Sign-On session notes from IUG 2026. This guide is aimed at library systems administrators considering or actively implementing SAML SSO for Sierra staff authentication. It covers the full stack: SAML protocol fundamentals, identity provider setup, Sierra-specific configuration, Keycloak’s emerging role, automated provisioning, MFA hardening, passwordless authentication, conditional access policies, and SAML debugging.
SAML (Security Assertion Markup Language) is an XML-based standard for exchanging authentication data between two parties:
Sierra acts as the SP. Your organization’s directory service acts as the IdP.
Staff member Sierra (SP) Your IdP
| | |
|-- launches Sierra ------->| |
| |-- AuthnRequest -------->|
| | (base64-encoded XML) |
| | |
|<------------- redirect to IdP login page -----------|
| |
|-- enters credentials + MFA ----------------------->|
| |
| |<-- SAML Response -------|
| | (signed XML assertion)|
| | |
| |-- validates signature |
| |-- extracts SSO ID |
| |-- matches to staff acct |
| | |
|<-- logged in -------------| |
The key thing: Sierra never sees the user’s password. It only receives a signed assertion from your IdP saying “this person authenticated successfully, and their username/email/uid is X.”
User starts at the IdP portal (Azure MyApps, Google apps launcher, Okta dashboard) and clicks a Sierra tile. The IdP generates a SAML Response directly without a preceding AuthnRequest. This works but is less secure — there’s no request-response correlation, making replay attacks easier. SP-initiated (what Sierra does) is preferred.
Before SSO works, the SP and IdP need to exchange metadata — XML documents describing each party’s configuration:
SP Metadata (Sierra provides this):
entityID — Sierra’s unique identifier (a URL)AssertionConsumerService — the ACS URL where the IdP sends responsesIdP Metadata (your IdP provides this):
entityID — your IdP’s unique identifierSingleSignOnService — the URL Sierra sends AuthnRequests toIn Sierra’s admin interface, you paste in your IdP’s metadata URL. Sierra generates its own SP metadata URL that you give to your IdP admin.
The signed XML assertion the IdP sends back contains:
<saml:Assertion>
<saml:Issuer>https://idp.yourlibrary.org</saml:Issuer>
<ds:Signature>...</ds:Signature>
<saml:Subject>
<saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">
jsmith@library.org
</saml:NameID>
<saml:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
<saml:SubjectConfirmationData
Recipient="https://sierra.library.org/saml/acs"
NotOnOrAfter="2026-04-15T14:35:00Z"/>
</saml:SubjectConfirmation>
</saml:Subject>
<saml:Conditions NotBefore="2026-04-15T14:29:00Z"
NotOnOrAfter="2026-04-15T14:35:00Z">
<saml:AudienceRestriction>
<saml:Audience>https://sierra.library.org/saml/metadata</saml:Audience>
</saml:AudienceRestriction>
</saml:Conditions>
<saml:AttributeStatement>
<saml:Attribute Name="uid">
<saml:AttributeValue>jsmith</saml:AttributeValue>
</saml:Attribute>
<saml:Attribute Name="email">
<saml:AttributeValue>jsmith@library.org</saml:AttributeValue>
</saml:Attribute>
</saml:AttributeStatement>
</saml:Assertion>
The critical parts:
| Format | When to Use |
|---|---|
emailAddress |
Most common; user’s email as identifier |
persistent |
Opaque pairwise ID; good for privacy |
unspecified |
Let the IdP decide |
For Sierra, emailAddress or unspecified with a uid attribute is typical.
Available on all paid editions (Business, Education, Nonprofits).
https://accounts.google.com/o/saml2/idp?idpid=<your_id>https://accounts.google.com/o/saml2?idpid=<your_id>EMAIL (or PERSISTENT)uid mapped to Primary email or Username)Gotcha for free nonprofit tier: No bulk YubiKey management — each key must be registered per-account manually in the admin console.
Reference: Google — Set up custom SAML app
uid mapped to user.userprincipalname or user.mailnickname)Reference: Microsoft — SAML SSO for apps
What RIT uses (as discussed in the session). Shibboleth is the standard in academic libraries.
Reference: Shibboleth IdP Documentation
Sierra supports any SAML 2.0 compliant IdP. The general process is always:
Requirements:
Back End Management > SAML Configuration > Identity Providers tab > ADD:
| Field | Description | Notes |
|---|---|---|
| Name | Unique identifier (min 3 chars) | Displayed on the login button. Immutable once created. |
| Usage | Patrons, Staff, or Both | Can have separate IdPs for patron vs. staff |
| Metadata URL | Your IdP’s metadata endpoint | Must be HTTPS, min 12 chars |
| Attribute | IdP response attribute to match against SSO IDs | e.g., uid, email, username |
| Duration in Seconds | Session validity | Default 3600; align with IdP session settings |
username,sso_id (header row ignored)username = Sierra login name (case-sensitive)sso_id = matching attribute from IdP (case-sensitive, must be unique)You can configure and test SAML without affecting production. Set up the IdP, upload SSO IDs, and test the flow before clicking ENABLE. Justin Newcomer specifically mentioned this in the session: “It’s self-service now. You can just go into the admin website and set it up yourself in test mode without interfering with production.”
| Application | SSO Support | Workaround |
|---|---|---|
| Sierra Desktop Client | Yes (6.1+) | — |
| Sierra Web | Yes (6.0+) | — |
| Admin App | Yes (6.0+) | — |
| Web Management Reports | Yes (6.1+) | — |
| Decision Center | No | Must have legacy password |
| Circa | No | Must have legacy password; Justin considering vibe-coding a replacement |
| Circulation overrides | Legacy only | Supervisor override pop-up uses legacy credentials |
| Innovative mobile worklists | No | On the roadmap |
| Vega mobile worklists | No | On the roadmap |
Keycloak is an open-source Identity and Access Management (IAM) server maintained by CNCF (formerly Red Hat). It provides SSO, identity brokering, user federation (LDAP/AD), support for OIDC, OAuth 2.0, and SAML 2.0, fine-grained authorization, and multi-tenancy via “realms.”
At the SSO session, an attendee (appearing to be from Innovative’s engineering side) mentioned that Vega currently runs through Keycloak and that there are plans to make Keycloak a shared service across Polaris and Sierra. If enough customers request this via IdeaLab, it could accelerate adoption.
[Keycloak]
/ | \
/ | \
[Sierra] [Polaris] [Vega]
SAML OIDC OIDC
Identity Brokering — Keycloak sits between your apps and your IdP:
[Sierra] <--SAML--> [Keycloak] <--OIDC--> [Azure AD]
<--SAML--> [Shibboleth]
<--OIDC--> [Google]
<--LDAP--> [Active Directory]
Benefits:
| Concept | What It Is |
|---|---|
| Realm | Isolated tenant — own users, groups, clients, IdPs. Think of it as a separate identity domain per library system. |
| Client | An application registered in Keycloak (Sierra would be a SAML client, Vega an OIDC client) |
| Identity Broker | Configuration to delegate auth to an external IdP (Azure AD, Google, Shibboleth, etc.) |
| User Federation | Direct connection to LDAP/AD — Keycloak queries the directory at login time |
| Protocol Mappers | Rules for which attributes/claims appear in tokens and assertions sent to clients |
Reference: Keycloak Server Administration Guide
The problem: Right now, Sierra SSO ID management is manual — upload a CSV of username,sso_id pairs, or set the SSO ID individually per staff record. When someone leaves, manually remove their account. No automatic group/permission mapping from your IdP.
SCIM (System for Cross-domain Identity Management) is a REST API standard (RFC 7643/7644) for automatically syncing users and groups between your IdP and applications. Sierra does not support SCIM today — this is aspirational and worth requesting via IdeaLab.
[HR System] --> [IdP (Azure/Okta/Google)] --> SCIM API --> [Sierra]
- Create user
- Set SSO ID
- Assign permissions
- Deactivate on departure
| Endpoint | Method | What It Does |
|---|---|---|
/Users |
POST |
Create a new staff account |
/Users/{id} |
GET |
Retrieve a staff account |
/Users/{id} |
PATCH |
Update attributes (name change, department transfer) |
/Users/{id} |
DELETE |
Deprovisioning (staff departure) |
/Groups |
POST/PATCH |
Create/update permission groups |
/Groups/{id} |
PATCH |
Add/remove members from groups |
| CSV Upload (current) | SCIM (aspirational) | |
|---|---|---|
| Timing | Batch (manual trigger) | Real-time |
| Deprovisioning | Often forgotten | Automatic when user deactivated in IdP |
| Group/permissions | Managed separately in Sierra | Could map IdP groups to Sierra permissions |
| Error handling | Errors block entire upload | Per-record HTTP error responses |
| Audit trail | Spreadsheet-level | Full HTTP request/response logs |
| Effort for 10 new hires | ~30 min manual work | Zero — automatic |
If Keycloak becomes the shared identity layer, Keycloak does have SCIM support that could potentially bridge the gap.
Standard push sends a simple “Approve / Deny” notification. This is vulnerable to MFA fatigue (prompt bombing):
| Organization | Date | What Happened |
|---|---|---|
| Uber | Sep 2022 | Lapsus$ bombarded a contractor’s phone + posed as IT via WhatsApp |
| Cisco | May 2022 | Voice phishing combined with push bombing; gained VPN access |
| Microsoft | Mar 2022 | Lapsus$ used MFA fatigue + session token replay; 37 GB source code stolen |
What RIT uses (Duo “Verified Push”). Microsoft calls it “number matching.”
Why it works: The user must be actively looking at both the login screen AND their phone. An attacker triggering prompts from their own browser sees a different number — the victim has no number to enter, so there’s nothing to mindlessly approve.
| Platform | Feature Name | Status |
|---|---|---|
| Microsoft Authenticator | Number matching | Mandatory for all tenants since May 2023 |
| Cisco Duo | Verified Duo Push | Available in Duo 4.x+; enable per policy |
| Okta Verify | Number Challenge | Configurable per policy |
| Risk-based challenges | Similar protection via context, not explicit number matching |
References:
This came up in the session discussion. Justin is interested but cautious. Passwordless happens at the IdP layer, not in Sierra — no changes to Sierra are required to go passwordless.
Registration:
Authentication:
Why it’s phishing-resistant: The credential is bound to the exact origin (e.g., https://sierra.library.org). A phishing site at https://sierra-library.evil.com simply can’t trigger the credential.
| Type | Examples | Pros | Cons |
|---|---|---|---|
| Hardware security keys | YubiKey 5, Google Titan, Feitian | Strongest security; hardware-bound; no battery | Must carry it; costs $25–70/key; limited credential slots (25 on YubiKey 5) |
| Platform authenticators | Windows Hello, Touch ID, Face ID | Very convenient; built into device | Tied to one device |
| Synced passkeys | iCloud Keychain, Google Password Manager, 1Password | Sync across devices | Less secure than hardware-bound (cloud compromise risk) |
Justin’s concern from the session: “If somebody didn’t have a password and all they needed was the YubiKey, and they know who the user is… I don’t like that.”
The answer: YubiKeys require a FIDO2 PIN.
Modern standard (what RIT does, per NIST SP 800-63B):
An attendee described this setup: MFA required off-network, skipped on the library’s network. “If somebody forgets their phone, they’re not going to be unable to work when they get in.”
Step 1: Create a Named Location
Step 2: Create the Conditional Access Policy
Critical: Always exclude at least one emergency/break-glass account from ALL conditional access policies.
Step 1: Create an Access Level
Step 2: Assign to Apps
Step 3: Configure 2-Step Verification
References:
Essential tool: SAML-tracer. Install the browser extension before you do anything else: Firefox | Chrome. Open it before attempting login. It intercepts HTTP traffic, detects SAML messages, and decodes them into readable XML. This is how you’ll diagnose every SSO problem.
Issuer and AssertionConsumerServiceURL<StatusCode>Success, the IdP rejected the request — check IdP logsSuccess, inspect the assertion fields (see table below)| Field | What to Check | Common Failure |
|---|---|---|
| Issuer | Matches the IdP entityID Sierra expects? | IdP entityID changed or SP misconfigured |
| Destination | Matches Sierra’s ACS URL exactly? | Trailing slash, HTTP vs HTTPS |
| Audience | Matches Sierra’s entityID? | SP entityID mismatch |
| NotBefore / NotOnOrAfter | Timestamps valid relative to Sierra’s clock? | Clock skew |
| Recipient | Matches ACS URL? | URL mismatch |
| Signature | Validates against IdP certificate? | Expired cert, cert rotation not applied |
| NameID / Attributes | Contains expected attribute with expected value? | Wrong attribute name, empty value, case mismatch |
Clock Skew
NotBefore/NotOnOrAfter in the assertion with Sierra server’s time (date -u)timedatectl status to verify.Certificate Mismatch
<ds:X509Certificate>, compare with Sierra’s configACS URL Mismatch
Attribute Name Mismatch
http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress but Sierra expects email<AttributeStatement> in SAML-tracer. Compare attribute Name values with what Sierra expects.SSO ID Case Mismatch
JSmith but IdP sends jsmith# Inspect a certificate's details and expiry openssl x509 -text -noout -in idp-cert.pem # Verify an XML signature (requires xmlsec1) xmlsec1 --verify --pubkey-cert-pem idp-cert.pem response.xml # Decode a base64 SAML message from a URL parameter echo "PHNhbWxwOl..." | base64 -d | xmllint --format - # Decode a deflated + base64 SAML message (HTTP-Redirect binding) echo "fZJNT8Mw..." | base64 -d | python3 -c \ "import sys,zlib; print(zlib.decompress(sys.stdin.buffer.read(),-15).decode())"
References: