Quick Pre-Flight Checks
Before diving into technical troubleshooting, verify these basic prerequisites. Most SSO login failures are due to one of these issues:1. Is SSO Enabled in Bruno?
Check this first:- Go to Bruno License Portal (
https://license.usebruno.com/) - Navigate to Settings → SSO
- Verify the “Enable SSO” toggle is ON
- If it’s OFF, toggle it ON and click Save Configuration
2. Is the User Already an Admin in Bruno License Portal?
Accessing the license portal requires admin access. Users will not need to be added as admins if they only need to activate their license via SSO. Check this next:- Go to Bruno License Portal → Settings → Admins
- Look for the user’s email address in the Admins list
- If the user is NOT in the list, they must be added first before they can use SSO
- Click the “Add Admin” button
- Enter the user’s email address
- Click Add
- The user will now be able to log in via SSO
- Go to Bruno License Portal → Settings → SSO
- Look at the “Admin Roles” field
- The user’s role (from their IdP) must match one of the values in this field
- Example: If Admin Roles is set to
admin,BrunoAdmin, the user’s role must be exactlyadminorBrunoAdmin
- In your IdP, check what role value is assigned to the user
- In Bruno License Portal → Settings → SSO, check the “Admin Roles” field
- Ensure they match exactly (case-sensitive)
3. Is SSO Configuration Complete?
Verify all required fields are filled:- Go to Bruno License Portal → Settings → SSO
- Check that these fields are NOT empty:
- SP Issuer ID / Entity ID
- IdP Login URL
- IdP Entity ID
- IdP Certificate
- Admin Roles (at least one role value)
Tip: If you’re not sure what values to use, refer to the SAML SSO Overview page for detailed explanations of each field.
Common Error Messages
”500 Internal Server Error” When Clicking “Login with SSO”
First, complete the pre-flight checks above (Is SSO enabled? Is the user an admin? Is configuration complete?) Possible Causes:- SSO is not enabled in Bruno (see Pre-Flight Check #1)
- User is not a License Manager Admin (see Pre-Flight Check #2)
- SSO configuration is incomplete (see Pre-Flight Check #3)
- Entity ID mismatch between Bruno and your IdP
- Invalid or malformed certificate in Bruno configuration
- IdP Login URL is missing or incorrect
-
Complete the pre-flight checks first:
- Verify SSO is enabled
- Verify the user is a License Manager Admin (role matches Admin Roles)
- Verify all required configuration fields are filled
-
Verify Entity ID matches exactly:
- The “SP Issuer ID / Entity ID” in Bruno must match the “Identifier (Entity ID)” in your IdP configuration
- Example: If Bruno has
bruno-demo, your IdP must also havebruno-demo - The value can be anything, but it must be identical in both places
-
Check certificate format:
- Open the certificate file you downloaded from your IdP
- Copy the entire contents including
-----BEGIN CERTIFICATE-----and-----END CERTIFICATE-----lines - Paste into Bruno’s IdP Certificate field
- Ensure there are no extra spaces or line breaks at the beginning or end
-
Verify IdP Login URL is correct:
- The IdP Login URL should be the SAML entry point from your IdP
- Example:
https://idp.example.com/app/123/sso/saml - This is typically found in your IdP’s SAML metadata
- Save the configuration: Click “Save Configuration” button after making changes
- Check browser console: Open Developer Tools (F12) → Console tab to see detailed error messages
- Try disabling and re-enabling SSO: Toggle the “Enable SSO” switch off, save, then toggle it back on and save again
IdP Test Login Shows Error or Redirects to Bruno Login Page
Possible Causes:- Reply URL (ACS URL) is configured incorrectly in your IdP
- Certificate or metadata mismatch
- SSO not fully enabled in Bruno
- Verify Reply URL (ACS URL): In your IdP’s SAML application configuration:
- Should be:
https://license.usebruno.com/api/v2/auth/sso/saml/acs/<your-subscription-id> - This is where your IdP sends the SAML response after authentication
- The subscription ID is shown in the Bruno License Portal SSO settings page
- This URL must match EXACTLY what’s configured in Bruno
- Copy this URL exactly from the Bruno SSO settings page
- Should be:
- Ensure SSO is enabled in Bruno:
- IdP test login will fail if SSO is not fully configured and enabled in Bruno
- Complete the Bruno SSO configuration first, then test from your IdP
- Check the full error message: The error message may be truncated. Try:
- Opening the test in a new incognito/private browser window
- Checking the browser console for the full error message
- Looking at the Network tab in Developer Tools for the failed request
- Common error patterns:
- Reply URL mismatch: Check ACS URL configuration
- Authentication method mismatch: Verify SAML 2.0 is configured
- User not assigned: Ensure user is assigned to the Bruno application
- Application not found: Verify application is properly configured
Testing Order: Always complete the Bruno SSO configuration first before testing from your IdP. The recommended testing flow is:
- Configure SSO in Bruno and save
- Test login by clicking “Login with SSO” from Bruno’s login page (SP-initiated)
- Once that works, test login from your IdP portal (IdP-initiated)
“SAML Response Validation Failed”
Possible Causes:- Certificate mismatch between IdP and Bruno configuration
- Expired or invalid SAML certificate
- Clock skew between IdP and Bruno servers
- Verify the certificate in Bruno matches the certificate from your IdP
- Ensure you’ve copied the entire certificate including
-----BEGIN CERTIFICATE-----and-----END CERTIFICATE-----lines - Check that your IdP’s certificate hasn’t expired
- Verify your server’s system clock is synchronized (NTP)
”Invalid ACS URL” or “Redirect URI Mismatch”
Possible Causes:- Incorrect ACS URL configured in your IdP
- Missing or incorrect domain ID in the ACS URL
- ACS URL format doesn’t match what Bruno expects
- Use the exact ACS URL shown in Bruno: Copy the SAML ACS URL directly from the Bruno SSO settings page
- The URL format may vary depending on your Bruno version
- Common formats:
https://license.usebruno.com/saml/acs/{your-domain-id}https://license.usebruno.com/api/v2/auth/sso/saml/acs/{your-domain-id}
- Check that you’ve replaced
{your-domain-id}with your actual domain ID from Bruno - Ensure there are no trailing slashes or extra spaces in the URL
- Important: The ACS URL in your IdP must match EXACTLY what Bruno shows in the SSO settings page
Always copy the ACS URL directly from the Bruno SSO settings page rather than using the documentation examples, as the URL format may vary between Bruno versions.
”403 Forbidden” Error After Successful IdP Authentication
Symptoms:- User successfully authenticates with their IdP
- User is redirected back to Bruno
- Bruno shows a 403 Forbidden error or “Access Denied” message
- Login does not complete
- Bruno extracts the
rolesattribute from the SAML response - Bruno checks if ANY of the user’s roles match the “Admin Roles” field
- If not, Bruno checks if ANY of the user’s roles match the “User Roles” field
- If neither match, Bruno returns a 403 Forbidden error
- Important: Role matching is case-sensitive and exact (
admin≠Admin)
-
Check the SAML response to see what role value is being sent:
- Open browser dev tools (F12) → Network tab
- Attempt SSO login again
- Look for the POST request to
/api/v2/auth/sso/saml/acs/ - In the request payload, find the
rolesattribute value - Example:
<saml2:AttributeValue>admin</saml2:AttributeValue> - Note: Users can have multiple roles; Bruno checks if ANY match
-
Verify role mapping in Bruno:
- Go to Bruno License Portal → Settings → SSO
- Check the “Admin Roles” and “User Roles” fields
- Ensure the exact role value from the SAML response is listed in one of these fields
- Important: Role matching is case-sensitive (
admin≠Admin)
- If SAML response shows:
<saml2:AttributeValue>admin</saml2:AttributeValue> - In Bruno Admin Roles field, add:
admin - Or in Bruno User Roles field, add:
admin - Click Save and test again
- Missing
rolesattribute in SAML response (not configured in IdP) - User not assigned to the Bruno application in IdP
- Quotes in role values (e.g.,
"admin"vsadmin) - Role value is empty or whitespace
- User Assignment: Verify the user is assigned to the Bruno application in your IdP
- Role Attribute Present: Confirm the
rolesattribute is being sent in the SAML response (check Network tab) - Quote Issues: Remove quotes from role values in your IdP configuration
- ❌ Bad:
"admin"(with quotes) - ✅ Good:
admin(no quotes)
- ❌ Bad:
- Empty Roles: Ensure the role value is not empty or just whitespace
Quick Test: If you’re unsure about role mapping, temporarily add a wildcard or common value like
user to both Admin Roles and User Roles fields in Bruno, then check what role value your IdP is actually sending in the SAML response.”User Not Found” or “Access Denied” After Role Mapping
Symptoms:- User’s role matches Bruno’s role mapping (403 error is gone)
- But user still cannot access Bruno
- Error message indicates user not found or access denied
- Bruno extracts the NameID from the SAML response (this should be the user’s email)
- Bruno converts the email to lowercase for consistency
- Bruno looks up the user in the database using this email
- If the user doesn’t exist, Bruno creates a new user account automatically
- If the user exists but is inactive, Bruno reactivates them
-
Verify the NameID is an email address:
- Open browser dev tools (F12) → Network tab
- Attempt SSO login again
- Look for the POST request to
/api/v2/auth/sso/saml/acs/ - In the SAML response, find the NameID value
- Example:
<saml:NameID>user@example.com</saml:NameID> - Ensure it’s a valid email address
-
Check email consistency:
- The NameID email should match the user’s email in your IdP
- Bruno uses this email to identify and create user accounts
- If the email changes between logins, Bruno will create a new account
-
Verify user assignment in IdP:
- Ensure the user is assigned to the Bruno application
- Check that the user’s email is correctly configured in the IdP
- Verify the user is assigned to the Bruno application in your IdP
- Ensure the NameID in your IdP is configured to send the user’s email address
- Check that the user’s email in the IdP is valid and consistent
- Verify the email attribute is correctly mapped in your IdP (should be NameID, not a separate attribute)
“Invalid Role” or “Insufficient Permissions”
Possible Causes:rolesattribute not configured correctly in IdProlesattribute value doesn’t match any role in Bruno’s Admin Roles or User Roles fieldsrolesattribute is missing from the SAML assertion- Role mapping not configured in Bruno License Portal
- Verify the
rolesattribute is configured in your IdP’s SAML attribute statements - Ensure the attribute name is exactly
roles(case-sensitive) - Check the SAML response to confirm the
rolesattribute is being sent and note its value - In Bruno License Portal → Settings → SSO, verify that the role value from the SAML assertion is listed in either:
- Admin Roles field (for admin access), or
- User Roles field (for standard access)
- Ensure role values are case-sensitive matches (e.g.,
Engineering≠engineering) - For your IdP: Verify the attribute/claim name is
rolesand the value matches what you configured in Bruno’s role mapping
Okta Role Debugging: Use Okta’s Preview SAML assertion feature:
- Go to Okta Admin → Applications → Bruno app → General tab
- Click Preview SAML assertion
- Select a test user to see exactly what role values will be sent
- Verify the
rolesattribute appears with the expected value - Copy this exact value to Bruno’s Admin Roles or User Roles field
Entra ID Role Debugging: Use the Test single sign-on feature:
- Go to Enterprise Applications → Bruno app → Single sign-on
- Click Test single sign-on with Bruno
- In the test results, expand View SAML response to see the actual claims being sent
- Look for the
rolesclaim and note its value - Ensure this exact value is configured in Bruno’s role mapping fields
”Missing User Information” or “Name Not Displayed”
Possible Causes:fullNameattribute not configured correctly in IdPfullNameattribute is missing from the SAML assertion- Name fields in IdP are empty
firstNameandlastNameattributes are not configured as fallback
fullName attribute is missing, Bruno attempts to construct it from firstName and lastName attributes. If all are missing, Bruno uses the email address as the name.
How Name Extraction Works (Backend Logic):
- Bruno first looks for a
fullNameattribute in the SAML response - If
fullNameis not found, Bruno looks forfirstNameandlastNameattributes - If found, Bruno combines them:
firstName + " " + lastName - If none of these are found, Bruno uses the email address (NameID) as the name
- The name is stored in the user’s profile
-
Check what name attributes are being sent:
- Open browser dev tools (F12) → Network tab
- Attempt SSO login again
- Look for the POST request to
/api/v2/auth/sso/saml/acs/ - In the SAML response, look for these attributes:
fullName(preferred)firstNameandlastName(fallback)
- Example:
<saml2:Attribute Name="fullName"><saml2:AttributeValue>John Doe</saml2:AttributeValue></saml2:Attribute>
-
Verify attribute names are case-insensitive:
- Bruno looks for attributes case-insensitively (e.g.,
fullName,FullName,FULLNAMEall work) - But the attribute values are case-sensitive
- Bruno looks for attributes case-insensitively (e.g.,
-
Check user profile after login:
- After a successful SSO login, check the user’s profile in Bruno
- If the name is just an email address, the name attributes weren’t found
-
Configure
fullNameattribute (recommended):- Verify the
fullNameattribute is configured in your IdP’s SAML attribute statements - Configure the attribute to combine first and last name (e.g., concatenation of first name + space + last name)
- Check that user profiles in your IdP have first name and last name populated
- Verify the
-
Or configure
firstNameandlastNameattributes (fallback):- If you can’t use
fullName, configure bothfirstNameandlastNameattributes - Bruno will automatically combine them with a space
- If you can’t use
-
Verify attributes are being sent:
- Check the SAML response to confirm the name attributes are being sent
- Use your IdP’s preview/test feature to verify attribute values
Okta fullName Configuration: In Okta attribute statements:
- Name:
fullName - Name format: Unspecified
- Value:
user.firstName+" "+user.lastName - Alternative:
user.displayNameif your Okta users have display names configured
Entra ID fullName Configuration: In Entra ID claims configuration:
- Claim name:
fullName - Source: Transformation
- Transformation:
Join() - Parameter 1:
user.givenname - Separator:
(space) - Parameter 2:
user.surname - Alternative: Use
user.displaynameif available and properly formatted
Configuration Verification Checklist
Use this checklist to verify your SAML SSO configuration:Identity Provider Configuration
- SAML application created for Bruno
- ACS URL configured correctly (copy from Bruno SSO settings page)
- Entity ID configured to match Bruno’s SP Issuer ID / Entity ID
- Name ID format set to EmailAddress
- Required attribute:
rolesconfigured to send user role values from your IdP (e.g.,Engineering,BrunoAdmin,IT-Team, etc.) - Required attribute:
fullNameconfigured (e.g., concatenation of first and last name) - Users or groups assigned to the Bruno application
- SAML certificate is valid and not expired
Bruno Configuration
- SAML SSO enabled in Bruno License Portal
- SP Issuer ID / Entity ID configured (must match IdP Entity ID exactly)
- IdP Login URL entered correctly
- IdP Entity ID entered correctly
- IdP Certificate pasted correctly (including BEGIN/END lines)
- Admin Roles configured with role values that should have admin access
- User Roles configured with role values that should have user access
- Role values match exactly (case-sensitive) with the values sent in the
rolesattribute from IdP - Session timeout configured appropriately
Testing and Debugging
Test SSO Connection
- In Bruno License Portal, navigate to Settings → SAML SSO
- Click Test SSO Connection
- You should be redirected to your IdP
- Authenticate with your IdP credentials
- You should be redirected back to Bruno
- Verify your user information and roles are displayed correctly
Check SAML Response
If SSO login fails, you can inspect the SAML response to diagnose issues:- Open your browser’s developer tools (F12)
- Go to the Network tab
- Attempt to log in via SSO
- Look for the POST request to
/saml/acs/ - Inspect the SAML response payload for errors
The SAML response contains assertions about the user’s identity and attributes. Look for missing or incorrect attribute values.
Verify Attribute Mapping
To verify that user attributes are being sent correctly:- Complete a successful SSO login
- In Bruno, check the user’s profile information
- Verify that the
fullNameattribute is populated correctly - If attributes are missing, check your IdP’s attribute mapping configuration
- Inspect the SAML response (see “Check SAML Response” section) to verify both
rolesandfullNameattributes are present
Verify Role Assignment
To verify that roles are being assigned correctly:- Complete a successful SSO login
- Check if the user has the expected access level (admin vs. user)
- If roles are incorrect:
- Check the SAML response to see what value is being sent in the
rolesattribute - Verify the
rolesattribute is configured in your IdP - In Bruno License Portal → Settings → SSO, check the “Admin Roles” and “User Roles” fields
- Ensure the role value from the SAML response matches one of the values in either field (case-sensitive)
- Example: If SAML sends
roles="Engineering", make sureEngineeringis listed in either Admin Roles or User Roles in Bruno
- Check the SAML response to see what value is being sent in the
Certificate Management
Certificate Expiration
SAML certificates typically expire after 1-3 years. When a certificate expires:- Generate a new certificate in your IdP
- Update the certificate in Bruno SAML SSO settings
- Test the SSO connection to verify it works
Certificate Format Issues
If you encounter certificate errors:- Ensure the certificate is in PEM format (Base64 encoded)
- Include the
-----BEGIN CERTIFICATE-----header - Include the
-----END CERTIFICATE-----footer - Remove any extra whitespace or line breaks within the certificate body
- Do not include the private key (only the public certificate)
Session and Timeout Issues
Users Being Logged Out Unexpectedly
Possible Causes:- Session timeout set too low
- IdP session timeout shorter than Bruno session timeout
- Browser cookie issues
- Increase the session timeout in Bruno SAML SSO settings
- Check your IdP’s session timeout settings
- Clear browser cookies and cache
- Ensure cookies are enabled in the browser
Okta Session Management: Check these Okta settings:
- Global Session Policy (Security → Authentication → Global Session Policy)
- Application Sign On Policy (Applications → Bruno app → Sign On tab → Sign On Policy)
- Okta session lifetime vs Bruno session timeout - the shorter one will take precedence
Entra ID Session Management: Check these Entra ID settings:
- Conditional Access policies with session controls (Azure AD → Security → Conditional Access)
- Token lifetime policies (Azure AD → Security → Token lifetime policies)
- User sign-in frequency settings in Conditional Access
- Persistent browser session settings
Session Not Ending When Expected
Possible Causes:- Session timeout set too high
- Browser keeping session alive
- Decrease the session timeout in Bruno SAML SSO settings
- Implement IdP-initiated logout if available
- Educate users to log out manually when finished
Attribute Configuration Troubleshooting
SAML Attribute Configuration
Issue: Users not getting correct roles or missing name information Solutions:- Verify the
rolesattribute is configured in your IdP:- Attribute/Claim name:
roles - Value: Can be any value (e.g.,
"admin","Engineering", department name, group name, etc.) - Ensure the attribute is included in the SAML assertion
- Attribute/Claim name:
- Verify the
fullNameattribute is configured in your IdP:- Attribute/Claim name:
fullName - Value: Combination of first and last name (e.g., “John Doe”)
- Common configurations:
- Static concatenation:
firstName + " " + lastName - Transformation/expression to join name fields
- Direct mapping from a single name field
- Static concatenation:
- Attribute/Claim name:
- Check attribute preview/test in your IdP to see what values will be sent
- Ensure attribute names are case-sensitive and match exactly
- Verify role mapping in Bruno: In Bruno License Portal → Settings → SSO:
- Check that the role value from your IdP is listed in either “Admin Roles” or “User Roles”
- Example: If your IdP sends
roles="Engineering", ensureEngineeringis in one of the role fields in Bruno
Testing Roles with Hardcoded Values
When to use this: If you’re having trouble getting role values to work correctly, you can temporarily configure a hardcoded role value in your IdP. This applies the same role to all users logging in via SSO and helps you isolate whether the issue is with role mapping or attribute configuration. Important: This is for testing only. Once you verify SSO is working, configure proper role values based on your user directory. Steps to test with hardcoded roles:-
In your IdP, configure the
rolesattribute with a static/hardcoded value:-
Okta: In the SAML app → General → SAML Attribute Statements, set:
- Name:
roles - Value:
admin(or any test value) - This will send
roles="admin"for all users
- Name:
-
Entra ID: In Enterprise Applications → Single sign-on → Attributes & Claims, add a new claim:
- Name:
roles - Source: Attribute
- Source attribute: Select any attribute (or use a static value if available)
- Or use Transformation with a static value like
"admin"
- Name:
-
Okta: In the SAML app → General → SAML Attribute Statements, set:
-
In Bruno License Portal, add this test value to Admin Roles:
- Go to Settings → SSO
- In the “Admin Roles” field, add the value you used (e.g.,
admin) - Click Save Configuration
-
Test SSO login:
- Try logging in via SSO
- If it works, the issue is with your role attribute configuration in the IdP
- If it still fails, the issue is elsewhere (certificate, ACS URL, etc.)
-
Once testing is complete:
- Remove the hardcoded value from your IdP
- Configure proper role values based on your user directory (departments, groups, etc.)
- Update Bruno’s Admin Roles and User Roles fields with the actual role values
Common IdP-Specific Configurations
For Okta:- Attribute statements with Name format: Unspecified
rolesvalue examples:"admin",user.department, static valuesfullNamevalue:user.firstName+" "+user.lastName
- Claims configuration with source: Attribute or Transformation
rolesvalue examples: staticadmin,user.department, group mappingsfullNametransformation: Join() withuser.givenname, space separator, anduser.surname
- Configure SAML attribute statements or claims
- Ensure attribute names match exactly:
rolesandfullName - Use appropriate value mappings for your user directory
Getting Additional Help
If you’ve tried the troubleshooting steps above and still encounter issues:- Review Documentation: Re-read the configuration guides for your specific IdP:
- Contact Support: Reach out to Bruno support with the following information:
- Your Bruno subscription ID
- Identity provider (Okta, Entra ID, or other SAML 2.0 provider)
- Error messages you’re seeing
- Steps you’ve already tried
- Screenshots of your configuration (redact sensitive information)