| 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 |
The profile enables organizations to describe Service Providers (SPs) and their supported SSO mechanisms in a machine-readable format, using JSON. It supports two main SSO link 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.
organization_info)This section contains metadata about the organization offering the SSO services.
description REQUIRED (str)
"An example description of the service provider organization".display_name REQUIRED (str)
"Example Service Provider".logotype REQUIRED (str, URL)
"https://example.com/logo.svg".name REQUIRED (str)
"Example Service Provider AB".url REQUIRED (str, URL)
"https://example.com".sso_links)This section contains a list of services that support SSO authentication.
description REQUIRED (str)
"Example Digital Math Service is the number one digital math companion in Schengen".disabled OPTIONAL (bool)
false.true → The service is disabled and not available to users.false → The service is active and can be used.false (the service is active).display_name REQUIRED (str)
"Math Rocket".entity_id REQUIRED (str, URL)
"https://example.com/math".logo REQUIRED (str, URL)
"https://example.com/math/logo.svg".sso_type REQUIRED (str)
"entity_id" → Standard SAML SSO using an entity ID."link_map" → Direct mapping between Identity Providers (IdPs) and specific login URLs."entity_id" for traditional SAML SSO.target_parameter OPTIONAL (str)
"Target".target_value OPTIONAL (str)
"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 starting with / optionally including query and fragment (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 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]*$" }
]
}
}
} |