Skip to main content

SAML Integration

FieldValue
Document IDASCEND-ENT-004
Version1.0.0
Last UpdatedDecember 19, 2025
AuthorAscend Engineering Team
PublisherOW-KAI Technologies Inc.
ClassificationEnterprise Client Documentation
ComplianceSOC 2 CC6.1/CC6.2, PCI-DSS 7.1/8.3, HIPAA 164.312, NIST 800-53 AC-2/SI-4

Reading Time: 7 minutes | Skill Level: Advanced

Overview

ASCEND supports SAML 2.0 for enterprise Single Sign-On. SAML provides robust identity federation with enterprise identity providers.

Supported IdPs

ProviderStatusNotes
Okta✅ Full supportSP and IdP initiated
Azure AD✅ Full supportMicrosoft Entra ID
OneLogin✅ Full support
Ping Identity✅ Full support
ADFS✅ Full supportWindows Server
Google Workspace✅ Full support
Custom SAML✅ Full supportAny SAML 2.0 IdP

Service Provider Metadata

Get SP Metadata

curl "https://pilot.owkai.app/api/sso/saml/metadata" \
-H "Authorization: Bearer <admin_jwt>"

SP Metadata:

<?xml version="1.0"?>
<md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata"
entityID="https://pilot.owkai.app/sso/saml">
<md:SPSSODescriptor
AuthnRequestsSigned="true"
WantAssertionsSigned="true"
protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
<md:NameIDFormat>
urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress
</md:NameIDFormat>
<md:AssertionConsumerService
Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
Location="https://pilot.owkai.app/sso/saml/callback"
index="0"/>
<md:SingleLogoutService
Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
Location="https://pilot.owkai.app/sso/saml/logout"/>
</md:SPSSODescriptor>
</md:EntityDescriptor>

SP Configuration Values

SettingValue
Entity IDhttps://pilot.owkai.app/sso/saml/{domain}
ACS URLhttps://pilot.owkai.app/sso/saml/callback
SLO URLhttps://pilot.owkai.app/sso/saml/logout
NameID FormatemailAddress

Configuration

Configure via Metadata URL

curl -X POST "https://pilot.owkai.app/api/sso/saml/configure" \
-H "Authorization: Bearer <admin_jwt>" \
-d '{
"domain": "company.com",
"idp_metadata_url": "https://company.okta.com/app/exk123/sso/saml/metadata"
}'

Configure via Metadata XML

curl -X POST "https://pilot.owkai.app/api/sso/saml/configure" \
-H "Authorization: Bearer <admin_jwt>" \
-d '{
"domain": "company.com",
"idp_metadata_xml": "<?xml version=\"1.0\"?>..."
}'

Manual Configuration

curl -X POST "https://pilot.owkai.app/api/sso/saml/configure" \
-H "Authorization: Bearer <admin_jwt>" \
-d '{
"domain": "company.com",
"idp_entity_id": "https://idp.company.com",
"idp_sso_url": "https://idp.company.com/sso",
"idp_slo_url": "https://idp.company.com/slo",
"idp_certificate": "-----BEGIN CERTIFICATE-----\n..."
}'

Attribute Mapping

Required Attributes

ASCEND AttributeCommon SAML Names
emailemail, emailAddress, mail, http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress
firstNamefirstName, givenName, http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname
lastNamelastName, surname, http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname
groupsgroups, memberOf, http://schemas.microsoft.com/ws/2008/06/identity/claims/groups

Configure Attribute Mapping

curl -X PUT "https://pilot.owkai.app/api/sso/saml/company.com/attributes" \
-H "Authorization: Bearer <admin_jwt>" \
-d '{
"attribute_mapping": {
"email": "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress",
"firstName": "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname",
"lastName": "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname",
"groups": "http://schemas.microsoft.com/ws/2008/06/identity/claims/groups",
"role": "custom:ascend_role"
}
}'

Provider-Specific Setup

Okta

  1. Create SAML 2.0 Application
  2. Configure:
    • Single Sign On URL: https://pilot.owkai.app/sso/saml/callback
    • Audience URI: https://pilot.owkai.app/sso/saml/company.com
    • Name ID format: Email Address
  3. Add attribute statements for groups

Azure AD

  1. Create Enterprise Application
  2. Configure SAML SSO
  3. Basic SAML Configuration:
    • Identifier: https://pilot.owkai.app/sso/saml/company.com
    • Reply URL: https://pilot.owkai.app/sso/saml/callback
  4. Configure claims

ADFS

# Add Relying Party Trust
Add-AdfsRelyingPartyTrust -Name "ASCEND" `
-MetadataUrl "https://pilot.owkai.app/sso/saml/metadata/company.com"

Security Settings

Configure Signing & Encryption

curl -X PUT "https://pilot.owkai.app/api/sso/saml/company.com/security" \
-H "Authorization: Bearer <admin_jwt>" \
-d '{
"sign_authn_requests": true,
"require_signed_assertions": true,
"require_encrypted_assertions": false,
"signature_algorithm": "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256",
"digest_algorithm": "http://www.w3.org/2001/04/xmlenc#sha256",
"want_assertions_encrypted": true,
"encryption_algorithm": "http://www.w3.org/2001/04/xmlenc#aes256-cbc"
}'

Certificate Management

# Upload new certificate
curl -X POST "https://pilot.owkai.app/api/sso/saml/company.com/certificate" \
-H "Authorization: Bearer <admin_jwt>" \
-d '{
"certificate": "-----BEGIN CERTIFICATE-----\n...",
"private_key": "-----BEGIN PRIVATE KEY-----\n...",
"activate_immediately": false
}'

# Activate certificate
curl -X PUT "https://pilot.owkai.app/api/sso/saml/company.com/certificate/activate" \
-H "Authorization: Bearer <admin_jwt>" \
-d '{
"certificate_id": "cert_abc123"
}'

Single Logout (SLO)

Configure SLO

curl -X PUT "https://pilot.owkai.app/api/sso/saml/company.com/slo" \
-H "Authorization: Bearer <admin_jwt>" \
-d '{
"enabled": true,
"idp_slo_url": "https://idp.company.com/slo",
"binding": "HTTP-POST"
}'

SLO Flow

User clicks logout


┌─────────────────┐
│ ASCEND sends │
│ LogoutRequest │───▶ IdP
└─────────────────┘

│◀─── LogoutResponse

┌─────────────────┐
│ Session │
│ terminated │
└─────────────────┘

IdP-Initiated SSO

Enable IdP-Initiated

curl -X PUT "https://pilot.owkai.app/api/sso/saml/company.com/idp-initiated" \
-H "Authorization: Bearer <admin_jwt>" \
-d '{
"enabled": true,
"default_relay_state": "/dashboard",
"allowed_relay_states": ["/dashboard", "/actions", "/agents"]
}'

Testing

Test SAML Configuration

curl -X POST "https://pilot.owkai.app/api/sso/saml/company.com/test" \
-H "Authorization: Bearer <admin_jwt>"

Decode SAML Response

curl -X POST "https://pilot.owkai.app/api/sso/saml/decode" \
-H "Authorization: Bearer <admin_jwt>" \
-d '{
"saml_response": "base64-encoded-response"
}'

Response:

{
"issuer": "https://idp.company.com",
"subject": "user@company.com",
"session_index": "_abc123",
"attributes": {
"email": "user@company.com",
"firstName": "John",
"lastName": "Doe",
"groups": ["ascend-admins", "engineering"]
},
"conditions": {
"not_before": "2025-12-15T10:00:00Z",
"not_on_or_after": "2025-12-15T10:05:00Z"
},
"signature_valid": true
}

Troubleshooting

Common Errors

ErrorCauseSolution
invalid_signatureCertificate mismatchUpdate IdP certificate
assertion_expiredClock skewSync server time, increase skew tolerance
unknown_issuerWrong entity IDVerify IdP entity ID
no_valid_assertionAssertion rejectedCheck conditions, signature

Debug Logging

curl -X PUT "https://pilot.owkai.app/api/sso/saml/company.com/debug" \
-H "Authorization: Bearer <admin_jwt>" \
-d '{
"enabled": true,
"log_saml_requests": true,
"log_saml_responses": true,
"expires_in_hours": 24
}'

View SAML Logs

curl "https://pilot.owkai.app/api/sso/saml/company.com/logs?hours=24" \
-H "Authorization: Bearer <admin_jwt>"

Best Practices

  1. Use SHA-256 - Avoid SHA-1 for signatures
  2. Require signed assertions - Never accept unsigned
  3. Short validity windows - 5 minutes or less
  4. Regular certificate rotation - Annual minimum
  5. Test before production - Use debug mode

Next Steps


Document Version: 1.0.0 | Last Updated: December 2025