{"id":4726,"date":"2025-01-06T09:19:17","date_gmt":"2025-01-06T08:19:17","guid":{"rendered":"https:\/\/kairntech.com\/doc\/?page_id=4726"},"modified":"2025-11-04T13:12:46","modified_gmt":"2025-11-04T12:12:46","slug":"single-sign-on-configuration-guide","status":"publish","type":"page","link":"https:\/\/kairntech.com\/doc\/single-sign-on-configuration-guide\/","title":{"rendered":"Single Sign-on Configuration Guide"},"content":{"rendered":"\n<p>Single sign-on (SSO) is supported through OpenID Connect. <\/p>\n\n\n\n<p>Supported identity providers (IdP) are Microsoft Entra ID and Keycloak.<\/p>\n\n\n\n<p>Configuration consists in 3 steps:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Declare and configure the Kairntech application\/client in the identity provider<\/li>\n\n\n\n<li>Configure the Kairntech platform  to connect to the identity provider<\/li>\n\n\n\n<li>Optionally define role and\/or group mapping <\/li>\n<\/ul>\n\n\n\n<h1 class=\"wp-block-heading\">Quick start<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Connecting Kairntech to the IdP<\/h2>\n\n\n\n<p>Let&#8217;s assume you want Kairntech platform to be accessible using that URL: <a href=\"https:\/\/your.kairntech.host\/sherpa\">https:\/\/your.kairntech.host\/sherpa<\/a><\/p>\n\n\n\n<p>In that case you want to declare and configure the Kairntech enterprise application or client with the following URLs:<\/p>\n\n\n\n<p>Redirect URL: <a href=\"https:\/\/your.kairntech.host\/oauth2\/callback\">https:\/\/your.kairntech.host\/oauth2\/callback<\/a><\/p>\n\n\n\n<p>Post logout redirect URL: <a href=\"https:\/\/your.kairntech.host\/sherpa\/#\/signin\">https:\/\/your.kairntech.host\/sherpa\/#\/signin<\/a><\/p>\n\n\n\n<p>Finally create a <strong>sso.yaml<\/strong> file, mount it in the <strong>\/app\/kairntech\/sherpa\/conf\/user\/<\/strong> directory of the <strong>sherpa-core<\/strong> docker container,  then restart the container. The content of that file slightly depends on the identity provider (see sub-paragraphs below).<\/p>\n\n\n\n<p>This should be enough to enable SSO and to map users in the &#8220;Default&#8221; group of the Kairntech platform with the following roles: &#8220;Default annotation components&#8221; and &#8220;Data analyst&#8221;. Those roles are not administrative roles but they will allow using all the features of all projects.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Microsoft Entra ID<\/h3>\n\n\n\n<p>Content of the <strong>sso.yaml<\/strong> file for Microsoft Entra ID:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sherpa:\n  httpserver:\n    auth:\n      schemes: jwt,basic,oauth2\n      oauth2:\n        troubleshoot: false\n<strong>        # replace with the address used to access Kairntech<\/strong>\n        appLocation: <strong>https:\/\/your.kairntech.host<\/strong>\n        provider: AzureAD\n        options:\n<strong>          # replace with the identifier of your EntraID tenant<\/strong>\n          tenant: <strong>813e8c6f-12f2-41ef-80d7-544ec1fd701e<\/strong>\n<strong>          # replace with the identifier of the Kairntech enterprise app<\/strong>\n          clientId: <strong>83744636-76be-4777-976c-1a59651a61df<\/strong> \n<strong>          # replace with the secret of the Kairntech enterprise app<\/strong>\n          clientSecret: <strong>6cd7c763-0435-4e51-aa34-8db689d2fdfb<\/strong>\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Keycloak<\/h3>\n\n\n\n<p>Content of the <strong>sso.yaml<\/strong> file for Microsoft Keycloak:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sherpa:\n  httpserver:\n    auth:\n      schemes: jwt,basic,oauth2\n      oauth2:\n        troubleshoot: false\n<strong><strong>        # replace with the address used to access Kairntech<\/strong><\/strong>\n        appLocation: <strong>https:\/\/your.kairntech.host<\/strong>\n        provider: Keycloak\n        options:\n<strong>          # replace with the address of your Keycloak server\n<\/strong>          site: \"<strong>https:\/\/your.keycloak.host<\/strong>\/realms\/{realm}\"\n<strong>          # replace with the Keycloak realm to be used\n<\/strong>          tenant: <strong>your-realm<\/strong>\n<strong>          # replace with the Kairntech Client ID<\/strong>\n          clientId: <strong>kairntech-app <\/strong>\n<strong>          # replace with the Kairntech Client Secret<\/strong>\n          clientSecret: 6cd7c76304354e51aa348db689d2fdfb<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">User mapping<\/h2>\n\n\n\n<p>The Kairntech platform has a user database with users, predefined roles, permissions etc&#8230; During the SSO login, the IdP user will be mapped to a Kairntech user into the database.<\/p>\n\n\n\n<p>You can use the identity returned by the IdP to initialize the following user fields in the Kairntech database:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>username: the identifier of the user<\/li>\n\n\n\n<li>profilename: the display name of the user<\/li>\n\n\n\n<li>email: the email of the user<\/li>\n\n\n\n<li>groups: groups the user is belonging to<\/li>\n\n\n\n<li>roles: roles granted to the user<\/li>\n<\/ul>\n\n\n\n<p>This is done using Jinja 2 snippets operating on the identity (and optionally the profile returned by the Microsoft Graph for Entra ID.<\/p>\n\n\n\n<p>Here is the default user mapping:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sherpa:\n  httpserver:\n    auth:\n      oauth2:\n        mapping:\n          user:\n            <strong>username.j2.mapping<\/strong>: |\n              {% if provider == 'AzureAD' -%}\n              {{ identity.oid }}\n              {% else -%}\n              {{ identity.preferred_username }}\n              {% endif -%}\n            <strong>profilename.j2.mapping<\/strong>: |\n              {{ identity.given_name ~ ' ' ~ identity.family_name }}\n            <strong>email.j2.mapping<\/strong>: | \n              {{ identity.email }}\n            <strong>groups.j2.array.mapping<\/strong>: |\n              {% set output = &#91;{'name': 'default' }] -%}<\/code><\/pre>\n\n\n\n<p>You don&#8217;t need to repeat it into your own configuration but you can override some fields.<br>For instance, if you want to use the displayName coming from the Microsoft Graph, you can create a <strong>sso-configuration.yaml<\/strong> file, mount it in the <strong>\/app\/kairntech\/sherpa\/conf\/user\/<\/strong> directory of the <strong>sherpa-core<\/strong> docker container,  then restart the container.<\/p>\n\n\n\n<p>Content of the <strong>sso-configuration.yaml<\/strong>  file:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sherpa:\n  httpserver:\n    auth:\n      oauth2:\n        mapping:\n          user:\n            <strong>profilename.j2.mapping<\/strong>: \"{{ profile.displayName }}\"\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Granting access to Kairntech<\/h2>\n\n\n\n<p>By default all IdP users will be allowed to connect using SSO because as soon as a user is part of a Kairntech group, they will be allowed to connect and, as show above, SSO users are mapped by default to the &#8220;Default&#8221; group.<\/p>\n\n\n\n<p>The first way to deny access to users is to use the &#8220;accessDenied&#8221; feature. <\/p>\n\n\n\n<p>For instance you can deny the access to any user that is not a member of a specific Entra ID group using the following configuration fragment:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sherpa:\n  httpserver:\n    auth:\n      oauth2:\n        mapping:\n          user:\n            <strong>accessDenied.j2.boolean.mapping<\/strong>: |\n              {%- set output = (profile.memberOf | selectattr(\"id\", \"equalto\", \"d56f7e19-2353-42f9-a288-0e3305dc0cd2Z\") | length  ) == 0 -%}<\/code><\/pre>\n\n\n\n<p>Here the SSO user will still be mapped the the &#8220;Default&#8221; group but it will be denied the access anyway. You can also use group mapping to deny access to users.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Group mapping<\/h2>\n\n\n\n<p>As shown above, SSO users are mapped into the Default group of Kairntech by default.<\/p>\n\n\n\n<p>If you can to leverage IdP groups (only Entra ID groups are supported right now), you will need the following configuration fragment:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sherpa:\n  httpserver:\n    auth:\n      oauth2:\n        profile:\n          provider: MicrosoftGraph\n          options:\n            # in order to get user group membership with MicrosoftGraph\n            withGroups: true\n            # or... in order to get user group transitive membership\n            withTransitiveGroups: true\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Explicit group mapping<\/h3>\n\n\n\n<p>You can use a more complex Jinja expression to return a different list of groups that will be created if they do not exist. For instance, this configuration file will map two Entra ID groups (matched using their identifiers) to Kairntech groups (named after the displayName of those IdP groups):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sherpa:\n  httpserver:\n    auth:\n      oauth2:\n        mapping:\n          user:\n            <strong>groups.j2.array.mapping<\/strong>: |\n  {% set ns = namespace(output=&#91;]) -%}\n  {% set idp_group_ids = &#91; \"b9d6685c-cb22-4875-81d1-3b5ffb6ed313\", \"82e198e1-83d8-431e-b2b1-a8313d0ddae4\" ] -%}\n  {% for idp_group_id in idp_group_ids -%}\n  {%    set idp_group = (profile.memberOf | selectattr('id', 'equalto', idp_group_id) | first) -%}\n  {%    if idp_group -%}\n  {%      set ns.output = ns.output + &#91;<strong>{'label': idp_group&#91;'displayName'], 'identifier': idp_group_id }<\/strong>] -%}\n  {%    endif -%}\n  {% endfor -%}\n  {% set output = ns.output -%}<\/code><\/pre>\n\n\n\n<p>That approach might be useful to bootstrap the initial Kairntech platform administrators: if &#8220;b9d6685c-cb22-4875-81d1-3b5ffb6ed313&#8221; and &#8220;82e198e1-83d8-431e-b2b1-a8313d0ddae4&#8221; are identifiers of the &#8220;Kairntech Administrators&#8221; and &#8220;Kairntech Power Users&#8221; groups (for instance), then only users belonging to those groups will be allowed to connect to Kairntech. That is because other users will have an empty list of groups and, as mentioned above, one has to be part of a Kairntech group to be able to connect.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Implicit group mapping<\/h3>\n\n\n\n<p>Once a Kairntech platform administrator has been allowed to connect using SSO, they can use the Kairntech user administration interface to create a Kairntech group and map it to an IdP group by selecting it in a drop-down list. <\/p>\n\n\n\n<p>Kairntech administrators might create a &#8220;Kairntech Users&#8221; groups that is mapped to a &#8220;Kairntech Users&#8221; IdP group.<\/p>\n\n\n\n<p>Even if that group is not explicitly mentioned into the user mapping, it is still possible to map it by using the &#8220;attach existing groups&#8221; feature that is activated by the following configuration snippet:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sherpa:\n  httpserver:\n    auth:\n      oauth2:\n        mapping:\n          attachExistingGroups: true<\/code><\/pre>\n\n\n\n<p>When activated, any SSO user who is a member of an IdP group that has already been mapped to a Kairntech group will be allowed to connect, even if the group is not mentioned into the <strong>groups.j2.array.mapping<\/strong> field of the mapping.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Role mapping<\/h2>\n\n\n\n<p>The Kairntech platform is providing many predefined roles and permissions. If generally requires many roles to provide the desired features to a user.<\/p>\n\n\n\n<p>It is possible to map IdP application roles and IdP groups to Kairntech roles. The default mapping is defined as followed:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sherpa:\n  httpserver:\n    auth:\n      oauth2:\n        mapping:\n          roles:\n            # using client app roles and identity provider groups\n            source: &#91; app_roles, idp_groups ]\n            # set independently of client app roles or provider groups\n            base: &#91; __DefaultAnnotationComponents ]\n            # set if no client app role or no identity provider group found\n            default: &#91; __ProjectManager ]<\/code><\/pre>\n\n\n\n<p>You can map an IdP group or an application role using the following syntax:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sherpa:\n  httpserver:\n    auth:\n      oauth2:\n        mapping:\n          roles:\n            # using client app roles and identity provider groups\n            source: &#91; app_roles, idp_groups ]\n            # set independently of client app roles or provider groups\n            base: &#91; __DefaultAnnotationComponents ]\n            # the \"Kairntech Administrators\" IdP group:\n            b9d6685c-cb22-4875-81d1-3b5ffb6ed313:\n                - PlatformProjectAdmin # can see all projects of all groups\n                - PlatformUserAdmin    # can see all groups and users\n                - __ProjectManager     # can use all features              \n            # a \"Kairntech Administrator\" app role:\n            KairntechAdmin:\n                - PlatformProjectAdmin # can see all projects of all groups\n                - PlatformUserAdmin    # can see all groups and users\n                - __ProjectManager     # can use all features              \n            # set if no client app role or no identity provider group found\n            default: &#91; __Evaluator ]<\/code><\/pre>\n\n\n\n<p>That mapping states that any member of the &#8220;Kairntech Administrators&#8221; IdP group will be granted the following roles:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>__DefaultAnnotationComponents  (always using the &#8220;base&#8221; role list)<\/li>\n\n\n\n<li>PlatformProjectAdmin  (coming from the b9d6685c-cb22-4875-81d1-3b5ffb6ed313 mapping)<\/li>\n\n\n\n<li>PlatformUserAdmin (same)<\/li>\n\n\n\n<li>__ProjectManager (same)<\/li>\n<\/ul>\n\n\n\n<p>User not belonging to the  &#8220;Kairntech Administrators&#8221; IdP group or not having the &#8220;Kairntech Administrator&#8221; app role will have the following roles:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>__DefaultAnnotationComponents (always using the &#8220;base&#8221; role list)<\/li>\n\n\n\n<li>__Evaluator (no mapped group or role, so using the &#8220;default&#8221; role list)<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Keeping mapped user in sync with the IdP<\/h2>\n\n\n\n<p>The user mapping is refreshed every 10 minutes. <\/p>\n\n\n\n<p>You can disable the refresh so it is only performed during login by using the following configuration fragment:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sherpa:\n  httpserver:\n    auth:\n      oauth2:\n        mapping:\n          refresh:\n            enabled: false<\/code><\/pre>\n\n\n\n<p>You can change the period of the refresh using:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sherpa:\n  httpserver:\n    auth:\n      oauth2:\n        mapping:\n          refresh:\n            # you can use expressions like \"30 seconds\", \"1 minute\", etc...\n            period: 2 hours<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Creating pre-defined roles<\/h2>\n\n\n\n<p>You can pre-create role using configuration fragments like this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sherpa:\n  httpserver:\n    auth:\n      ldapmongo:\n        predefined:\n          permissionGroups:\n            # permission groups that can be referenced by multiple roles\n            allUsersNavMenusEntries:\n              - seeOverallStats\n              - seeCorpusStats\n              - seeExplore\n              - seeDocuments\n              - seeUiSettings\n              - seeUserProfile\n              - seeSearchCompare\n          roles:\n            __RegularUser:\n              label: Regular User\n              type: functional\n              scope: platform\n              permissions:\n                - useSearch\n              permissionGroups:\n                - allUsersNavMenusEntries\n            __PowerUser:\n              label: Power User\n              type: functional\n              scope: platform\n              permissions:\n                - writeLabel\n                - createProject\n                - deleteProject\n                - exportProject\n                - useSearch\n              permissionGroups:\n                - allUsersNavMenusEntries<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Troubleshooting<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Activating troubleshooting mode<\/h3>\n\n\n\n<p>When configured to use Entra ID, the login page will have the following button:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"665\" height=\"428\" src=\"https:\/\/kairntech.com\/doc\/wp-content\/uploads\/sites\/2\/2024\/12\/image.png\" alt=\"\" class=\"wp-image-4768\" srcset=\"https:\/\/kairntech.com\/doc\/wp-content\/uploads\/sites\/2\/2024\/12\/image.png 665w, https:\/\/kairntech.com\/doc\/wp-content\/uploads\/sites\/2\/2024\/12\/image-300x193.png 300w\" sizes=\"auto, (max-width: 665px) 100vw, 665px\" \/><\/figure>\n\n\n\n<p>You can Ctrl+double-click on the &#8220;Kairntech&#8221; word on the left of the footer to temporarily activate the troubleshooting mode (indicated by a bug icon):<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"663\" height=\"428\" src=\"https:\/\/kairntech.com\/doc\/wp-content\/uploads\/sites\/2\/2024\/12\/image-1.png\" alt=\"\" class=\"wp-image-4769\" srcset=\"https:\/\/kairntech.com\/doc\/wp-content\/uploads\/sites\/2\/2024\/12\/image-1.png 663w, https:\/\/kairntech.com\/doc\/wp-content\/uploads\/sites\/2\/2024\/12\/image-1-300x194.png 300w\" sizes=\"auto, (max-width: 663px) 100vw, 663px\" \/><\/figure>\n\n\n\n<p>This will allow to test the connection to the IdP and test the user mapping without actually creating the mapped user in the Kairntech user database. <\/p>\n\n\n\n<p>You can also permanently activate the troubleshooting mode by using the following configuration fragment:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sherpa:\n  httpserver:\n    auth:\n      schemes: jwt,basic,oauth2\n      oauth2:\n        <strong>troubleshoot: true<\/strong><\/code><\/pre>\n\n\n\n<p>This will prevent any user to connect to the application during the configuration of the SSO.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Using the troubleshooting mode<\/h3>\n\n\n\n<p>You can type the JSON representation of the oauth2 configuration in the left panel, then press the Test button to have a look at the result of the mapping and at the identity and profile returned by the IdP:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"389\" src=\"https:\/\/kairntech.com\/doc\/wp-content\/uploads\/sites\/2\/2024\/12\/image-2-1024x389.png\" alt=\"\" class=\"wp-image-4770\" srcset=\"https:\/\/kairntech.com\/doc\/wp-content\/uploads\/sites\/2\/2024\/12\/image-2-1024x389.png 1024w, https:\/\/kairntech.com\/doc\/wp-content\/uploads\/sites\/2\/2024\/12\/image-2-300x114.png 300w, https:\/\/kairntech.com\/doc\/wp-content\/uploads\/sites\/2\/2024\/12\/image-2-768x292.png 768w, https:\/\/kairntech.com\/doc\/wp-content\/uploads\/sites\/2\/2024\/12\/image-2-1536x583.png 1536w, https:\/\/kairntech.com\/doc\/wp-content\/uploads\/sites\/2\/2024\/12\/image-2.png 1775w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>You can also test your Jinja 2 expressions and press the &#8220;Use expression as&#8230;&#8221; button to inject that into the mapping. For instance:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"254\" src=\"https:\/\/kairntech.com\/doc\/wp-content\/uploads\/sites\/2\/2024\/12\/image-3-1024x254.png\" alt=\"\" class=\"wp-image-4771\" srcset=\"https:\/\/kairntech.com\/doc\/wp-content\/uploads\/sites\/2\/2024\/12\/image-3-1024x254.png 1024w, https:\/\/kairntech.com\/doc\/wp-content\/uploads\/sites\/2\/2024\/12\/image-3-300x74.png 300w, https:\/\/kairntech.com\/doc\/wp-content\/uploads\/sites\/2\/2024\/12\/image-3-768x190.png 768w, https:\/\/kairntech.com\/doc\/wp-content\/uploads\/sites\/2\/2024\/12\/image-3-1536x381.png 1536w, https:\/\/kairntech.com\/doc\/wp-content\/uploads\/sites\/2\/2024\/12\/image-3.png 1790w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Then go back to the User Mapping Troubleshooting tab, press the test button, and if you are happy with the result you can press the &#8220;Download YAML configuration fragment button&#8221; that will download the <strong>sso-configuration.yaml<\/strong> file:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"908\" height=\"440\" src=\"https:\/\/kairntech.com\/doc\/wp-content\/uploads\/sites\/2\/2024\/12\/image-4.png\" alt=\"\" class=\"wp-image-4772\" srcset=\"https:\/\/kairntech.com\/doc\/wp-content\/uploads\/sites\/2\/2024\/12\/image-4.png 908w, https:\/\/kairntech.com\/doc\/wp-content\/uploads\/sites\/2\/2024\/12\/image-4-300x145.png 300w, https:\/\/kairntech.com\/doc\/wp-content\/uploads\/sites\/2\/2024\/12\/image-4-768x372.png 768w\" sizes=\"auto, (max-width: 908px) 100vw, 908px\" \/><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\">Detailed procedure<\/h1>\n","protected":false},"excerpt":{"rendered":"<p>Single sign-on (SSO) is supported through OpenID Connect. Supported identity providers (IdP) are Microsoft Entra ID and Keycloak. Configuration consists in 3 steps: Quick start Connecting Kairntech to the IdP Let&#8217;s assume you want Kairntech platform to be accessible using that URL: https:\/\/your.kairntech.host\/sherpa In that case you want to declare and configure the Kairntech enterprise [&hellip;]<\/p>\n","protected":false},"author":6,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-4726","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Single Sign-on Configuration Guide - Kairntech Documentation<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kairntech.com\/doc\/single-sign-on-configuration-guide\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Single Sign-on Configuration Guide - Kairntech Documentation\" \/>\n<meta property=\"og:description\" content=\"Single sign-on (SSO) is supported through OpenID Connect. Supported identity providers (IdP) are Microsoft Entra ID and Keycloak. Configuration consists in 3 steps: Quick start Connecting Kairntech to the IdP Let&#8217;s assume you want Kairntech platform to be accessible using that URL: https:\/\/your.kairntech.host\/sherpa In that case you want to declare and configure the Kairntech enterprise [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kairntech.com\/doc\/single-sign-on-configuration-guide\/\" \/>\n<meta property=\"og:site_name\" content=\"Kairntech Documentation\" \/>\n<meta property=\"article:modified_time\" content=\"2025-11-04T12:12:46+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kairntech.com\/doc\/wp-content\/uploads\/sites\/2\/2024\/12\/image.png\" \/>\n\t<meta property=\"og:image:width\" content=\"665\" \/>\n\t<meta property=\"og:image:height\" content=\"428\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kairntech.com\/doc\/single-sign-on-configuration-guide\/\",\"url\":\"https:\/\/kairntech.com\/doc\/single-sign-on-configuration-guide\/\",\"name\":\"Single Sign-on Configuration Guide - Kairntech Documentation\",\"isPartOf\":{\"@id\":\"https:\/\/kairntech.com\/doc\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kairntech.com\/doc\/single-sign-on-configuration-guide\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kairntech.com\/doc\/single-sign-on-configuration-guide\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kairntech.com\/doc\/wp-content\/uploads\/sites\/2\/2024\/12\/image.png\",\"datePublished\":\"2025-01-06T08:19:17+00:00\",\"dateModified\":\"2025-11-04T12:12:46+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/kairntech.com\/doc\/single-sign-on-configuration-guide\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kairntech.com\/doc\/single-sign-on-configuration-guide\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\/\/kairntech.com\/doc\/single-sign-on-configuration-guide\/#primaryimage\",\"url\":\"https:\/\/kairntech.com\/doc\/wp-content\/uploads\/sites\/2\/2024\/12\/image.png\",\"contentUrl\":\"https:\/\/kairntech.com\/doc\/wp-content\/uploads\/sites\/2\/2024\/12\/image.png\",\"width\":665,\"height\":428},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kairntech.com\/doc\/single-sign-on-configuration-guide\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kairntech.com\/doc\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Single Sign-on Configuration Guide\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kairntech.com\/doc\/#website\",\"url\":\"https:\/\/kairntech.com\/doc\/\",\"name\":\"Kairntech Documentation\",\"description\":\"All the information you need to use Kairntech Software, methodology,  user and installation guides.\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kairntech.com\/doc\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Single Sign-on Configuration Guide - Kairntech Documentation","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kairntech.com\/doc\/single-sign-on-configuration-guide\/","og_locale":"en_GB","og_type":"article","og_title":"Single Sign-on Configuration Guide - Kairntech Documentation","og_description":"Single sign-on (SSO) is supported through OpenID Connect. Supported identity providers (IdP) are Microsoft Entra ID and Keycloak. Configuration consists in 3 steps: Quick start Connecting Kairntech to the IdP Let&#8217;s assume you want Kairntech platform to be accessible using that URL: https:\/\/your.kairntech.host\/sherpa In that case you want to declare and configure the Kairntech enterprise [&hellip;]","og_url":"https:\/\/kairntech.com\/doc\/single-sign-on-configuration-guide\/","og_site_name":"Kairntech Documentation","article_modified_time":"2025-11-04T12:12:46+00:00","og_image":[{"width":665,"height":428,"url":"https:\/\/kairntech.com\/doc\/wp-content\/uploads\/sites\/2\/2024\/12\/image.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Estimated reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/kairntech.com\/doc\/single-sign-on-configuration-guide\/","url":"https:\/\/kairntech.com\/doc\/single-sign-on-configuration-guide\/","name":"Single Sign-on Configuration Guide - Kairntech Documentation","isPartOf":{"@id":"https:\/\/kairntech.com\/doc\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kairntech.com\/doc\/single-sign-on-configuration-guide\/#primaryimage"},"image":{"@id":"https:\/\/kairntech.com\/doc\/single-sign-on-configuration-guide\/#primaryimage"},"thumbnailUrl":"https:\/\/kairntech.com\/doc\/wp-content\/uploads\/sites\/2\/2024\/12\/image.png","datePublished":"2025-01-06T08:19:17+00:00","dateModified":"2025-11-04T12:12:46+00:00","breadcrumb":{"@id":"https:\/\/kairntech.com\/doc\/single-sign-on-configuration-guide\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kairntech.com\/doc\/single-sign-on-configuration-guide\/"]}]},{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/kairntech.com\/doc\/single-sign-on-configuration-guide\/#primaryimage","url":"https:\/\/kairntech.com\/doc\/wp-content\/uploads\/sites\/2\/2024\/12\/image.png","contentUrl":"https:\/\/kairntech.com\/doc\/wp-content\/uploads\/sites\/2\/2024\/12\/image.png","width":665,"height":428},{"@type":"BreadcrumbList","@id":"https:\/\/kairntech.com\/doc\/single-sign-on-configuration-guide\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kairntech.com\/doc\/"},{"@type":"ListItem","position":2,"name":"Single Sign-on Configuration Guide"}]},{"@type":"WebSite","@id":"https:\/\/kairntech.com\/doc\/#website","url":"https:\/\/kairntech.com\/doc\/","name":"Kairntech Documentation","description":"All the information you need to use Kairntech Software, methodology,  user and installation guides.","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kairntech.com\/doc\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"}]}},"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/kairntech.com\/doc\/wp-json\/wp\/v2\/pages\/4726","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kairntech.com\/doc\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/kairntech.com\/doc\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/kairntech.com\/doc\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/kairntech.com\/doc\/wp-json\/wp\/v2\/comments?post=4726"}],"version-history":[{"count":31,"href":"https:\/\/kairntech.com\/doc\/wp-json\/wp\/v2\/pages\/4726\/revisions"}],"predecessor-version":[{"id":5657,"href":"https:\/\/kairntech.com\/doc\/wp-json\/wp\/v2\/pages\/4726\/revisions\/5657"}],"wp:attachment":[{"href":"https:\/\/kairntech.com\/doc\/wp-json\/wp\/v2\/media?parent=4726"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}