| Version | Date | Notes |
|---|---|---|
| 0.1 | 2025-Q1 | First pilot draft |
| 0.2 | 2026-02-05 | Explicit target handling added Support for relative target paths Improved validation of link map login URLs |
| 0.3 | 2026-03-01 | Introduced IdP Discovery Metadata feed. Refactored document structure for consistency and clarity. |
This technical profile defines two independent JSON-based metadata feeds used within the SSO infrastructure:
SP SSO Links Metadata Feed – Describes Service Providers (SPs) and how SSO can be initiated.
IdP Discovery Metadata Feed – Provides a simplified Identity Provider (IdP) catalog in JSON format for UI presentation, discovery services, and portal implementations.
The feeds are independent and may be implemented separately.
Both feeds:
MUST use application/json
MUST use UTF-8 encoding
MUST validate against their respective JSON Schemas defined in this document
The SP SSO Links Metadata feed provides information about how SSO can be initiated for Service Providers within the federation.
It supports two SSO types:
EntityID-based login: Relies on the identity provider’s entityID and parameters such as idp_parameter, target_parameter, and an SP-initiated login URL.
Link map-based login: Uses explicit mappings between known IdP entityIDs and proprietary login URLs.
Each metadata entry includes descriptive and branding information about the organization and its services, including display names, logos, and landing pages, facilitating consistent presentation in discovery services and login portals.
The SP SSO Links Metadata feed MUST be a JSON array.
Each array element MUST be a JSON object containing organization_info and sso_links.
organization_info)This section contains metadata about the organization offering the SSO services.
The organization_info object MUST contain the following properties:
| Field | Required | Type | Description |
|---|---|---|---|
description | YES | string | A short description of the organization and its services |
display_name | YES | string | A user-friendly name of the organization |
logotype | YES | string (URI) | The URL of the organization's logo |
name | YES | string | The official legal name of the organization |
url | YES | string (URI) | The official website of the organization |
All properties are REQUIRED.
Additional properties MUST NOT be included.
{
"description": "An example description of the service provider organization",
"display_name": "Example Service Provider",
"logotype": "https://example.com/logo.svg",
"name": "Example Service Provider AB",
"url": "https://example.com"
} |
sso_links)This section contains a list of services that support SSO authentication.
sso_links MUST be an array containing one object per service.
Each SSO link object MUST contain the following properties unless otherwise specified:
| Field | Required | Type | Description |
|---|---|---|---|
description | YES | string | A short description of the service |
display_name | YES | string | The name of the service displayed to users |
entity_id | YES | string (URI) | The SAML entityID of the service |
logo | YES | string (URI) | The URL of the service's logo |
sso_type | YES | string | The type of SSO configuration |
disabled | NO | boolean | Indicates whether the SSO link is disabled |
target_parameter | NO | string | The parameter used to pass a target address |
target_value | NO | string | The value used to pass a target address |
description (REQUIRED, string)
A short description of the service.
Example:
"Example Digital Math Service is the number one digital math companion in Schengen"
display_name (REQUIRED, string)
The name of the service displayed to users.
Example:
"Math Rocket"
entity_id (REQUIRED, string, URI)
The entity ID of the service in the SAML federation.
Example:
"https://example.com/math"
logo (REQUIRED, string, URI)
The URL of the service’s logo.
Example:
"https://example.com/math/logo.svg"
sso_type (REQUIRED, string)
Defines how SSO is initiated for the service.
Allowed values:
"entity_id" – Standard SAML SSO using an entity ID.
"link_map" – Direct mapping between Identity Providers (IdPs) and specific login URLs.
Example:
"sso_type": "entity_id"
disabled (OPTIONAL, boolean)
Indicates whether the SSO link is disabled.
If omitted, the value MUST be interpreted as false.
Allowed values:
true – The service is disabled and MUST NOT be presented to users.
false – The service is active.
Example:
"disabled": false
target_parameter (OPTIONAL, string)
The parameter used to pass a target address after authentication.
Example:
"target_parameter": "Target"
target_value (OPTIONAL, string)
The value used to pass a target address after authentication.
Example:
"target_value": "https://example.com/math/resource"
If either target_parameter or target_value is present, the other MUST also be present.
target_value MAY be:
An absolute URI, or
An absolute-path reference beginning with /, optionally including query and fragment components, interpreted relative to the service’s own origin.
sso_type is "entity_id"These fields are required for a standard SAML SSO setup using the entity ID as parameter for identifying the IdP.
idp_parameter REQUIRED (str)
"entityID".sp_init REQUIRED (str, URL)
"https://example.com/math/Shibboleth.sso/Login?".sso_type is "link_map"Fields used when the service uses direct mapping between IdPs and specific login URLs
link_mapping REQUIRED (object)
"link_mapping": {
"https://idp.example1.com": "https://example.com/bjj/login?idp=example1-idp",
"https://idp.example2.com": "https://example.com/bjj/login?idp=example2-idp",
"https://idp.example3.com": "https://example.com/bjj/login?idp=example3-idp"
}, |
[
{
"organization_info": {
"description": "An example description of the service provider organization",
"display_name": "Example Service Provider",
"logotype": "https://example.com/logo.svg",
"name": "Example Service Provider AB",
"url": "https://example.com"
},
"sso_links": [
{
"description": "Example Digital Math Service is the number one digital math companion in Schengen",
"disabled": false,
"display_name": "Math Rocket",
"entity_id": "https://example.com/math",
"idp_parameter": "entityID",
"logo": "https://example.com/math/logo.svg",
"sp_init": "https://example.com/math/Shibboleth.sso/Login?",
"sso_type": "entity_id",
"target_parameter": "Target",
"target_value": "https://example.com/math/resource"
},
{
"description": "Example Digital Brazilian Jiu-Jitsu Service is the number one digital BJJ teacher in Schengen",
"disabled": false,
"display_name": "Example Digital Brazilian Jiu-Jitsu Service",
"entity_id": "https://example.com/bjj",
"link_mapping": {
"https://idp.example1.com": "https://example.com/bjj/login?idp=example1-idp",
"https://idp.example2.com": "https://example.com/bjj/login?idp=example2-idp",
"https://idp.example3.com": "https://example.com/bjj/login?idp=example3-idp"
},
"logo": "https://example.com/bjj/logo.png",
"sso_type": "link_map"
}
]
}
] |
JSON schema for validating SP SSO links metadata:
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "array",
"items": {
"type": "object",
"properties": {
"organization_info": {
"type": "object",
"properties": {
"description": { "type": "string" },
"display_name": { "type": "string" },
"logotype": { "type": "string", "format": "uri" },
"name": { "type": "string" },
"url": { "type": "string", "format": "uri" }
},
"required": ["description", "display_name", "logotype", "name", "url"],
"additionalProperties": false
},
"sso_links": {
"type": "array",
"items": {
"type": "object",
"properties": {
"description": { "type": "string" },
"disabled": { "type": "boolean" },
"display_name": { "type": "string" },
"entity_id": { "type": "string", "format": "uri" },
"idp_parameter": { "type": "string" },
"logo": { "type": "string", "format": "uri" },
"sp_init": { "type": "string", "format": "uri" },
"sso_type": { "type": "string", "enum": ["entity_id", "link_map"] },
"target_parameter": { "type": "string" },
"target_value": { "$ref": "#/definitions/uriOrRelativePath" },
"link_mapping": {
"type": "object",
"minProperties": 1,
"patternProperties": {
".*": { "type": "string", "format": "uri", "pattern": "^https://" }
},
"additionalProperties": false,
"propertyNames": { "type": "string", "minLength": 1 }
}
},
"required": ["description", "display_name", "entity_id", "logo", "sso_type"],
"anyOf": [
{
"properties": { "sso_type": { "const": "entity_id" } },
"required": ["idp_parameter", "sp_init"]
},
{
"properties": { "sso_type": { "const": "link_map" } },
"required": ["link_mapping"]
}
],
"allOf": [
{
"if": { "required": ["target_parameter"] },
"then": { "required": ["target_value"] }
},
{
"if": { "required": ["target_value"] },
"then": { "required": ["target_parameter"] }
}
],
"additionalProperties": false
}
}
},
"required": ["organization_info", "sso_links"],
"additionalProperties": false
},
"definitions": {
"uriOrRelativePath": {
"anyOf": [
{ "type": "string", "format": "uri" },
{ "type": "string", "pattern": "^/(?!/)[^\\s]*$" }
]
}
}
} |
The IdP Discovery Metadata feed provides a structured JSON representation of Identity Providers intended for consumption by:
Discovery services (WAYF / inverse discovery)
Login portals
Federation UI implementations
IdP selection interfaces
The purpose of this feed is to enable consistent and predictable presentation of Identity Providers across user-facing services.
This feed does not replace SAML metadata.
SAML metadata remains the authoritative source for federation trust and protocol configuration.
The IdP Discovery Metadata feed may be generated from one or more authoritative sources, including but not limited to federation SAML metadata.
The IdP Discovery Metadata feed MUST be a JSON array containing one object per Identity Provider.
Each IdP object MUST contain the following fields:
| Field | Required | Type | Description |
|---|---|---|---|
entity_id | YES | string (URI) | The SAML entityID of the IdP in the federation |
description | YES | string | A short description of the organization and its services |
display_name | YES | string | A user-friendly name for display purposes |
logotype | YES | string (URI) | URL to the organization's logo |
name | YES | string | The official legal name of the organization |
url | YES | string (URI) | The official website of the organization |
All properties are REQUIRED.
Additional properties MUST NOT be included.
[
{
"entity_id": "https://idp.example.se/idp",
"description": "Example Municipality Identity Provider for staff and student login.",
"display_name": "Example Municipality",
"logotype": "https://idp.example.se/static/logo.svg",
"name": "Example Municipality AB",
"url": "https://www.example.se"
}
] |
The IdP Discovery feed MUST validate against the following JSON Schema (Draft-07):
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "IdP Discovery metadata feed",
"type": "array",
"items": {
"type": "object",
"properties": {
"entity_id": {
"type": "string",
"format": "uri"
},
"description": {
"type": "string",
"minLength": 1
},
"display_name": {
"type": "string",
"minLength": 1
},
"logotype": {
"type": "string",
"format": "uri"
},
"name": {
"type": "string",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri"
}
},
"required": [
"entity_id",
"description",
"display_name",
"logotype",
"name",
"url"
],
"additionalProperties": false
}
} |
For both metadata feeds:
Content-Type MUST be application/json
Encoding MUST be UTF-8
Feeds MUST validate against their respective JSON Schemas