April 12, 2020
In this medium, I will be 🚶walking through on how to configure SAML Federated Authentication & SSO flow between WSO2 API Manager and Keycloak including JIT (User) Provisioning.
In my previous mediums, I have used WSO2 API Manager 2.6 & WSO2 Identity Server as Key Manager 5.7 to achieve the SAML2 SSO Federated authentication flows.
Today, I will be using only the API Manager 2.6 pack and the Out-Of-The-Box features to achieve the requirement
As out-of-the-box, the WSO2 API Manager 2.6 provides a platform to configure SAML2 Federation.
But, please note that it is advised (best-practice) to use WSO2 Identity Server as Key Manager to perform Federated Authentication with External Identity Providers in Production grade environments.
Let’s break-in…
Let’s start our configurations from the External Identity Provider.
I hope you already have an active Keycloak server up and running. If not please follow the below section to download and start a Keycloak server in your environment.
Click Here to download the Keycloak standalone distribution to your environment. Extract the archive and navigate to the <keycloak>/bin directory and execute the following command to start the Keycloak server …
Keycloak is an open-source identity and access management solution
# move to bin directory and execute the following# unixsh standalone.sh# windowsstandalone.bat
Then, fire-up your favorite browser and go to http://localhost:8080/auth. In the prompted page, register an admin user for our Keycloak server.
& Done … simple as that 👏 👏
👉 You can follow up on the following Doc to get started with the Keycloak server …
This guide helps you get started with Keycloak
After a successful log-in to the Keycloak server with our admin user, you will be looking into a similar UI as follows
Click on the SAML 2.0 Identity Provider Metadata to get the required configurations metadata.
Save the metadata as we will be using that in the following sections to configure Federated Identity Provider.
Click on the Clients under Configure to list all the existing registered clients of Keycloak Server. You will be looking into a similar screen as follows
We will be using the existing Master realm to create required Clients, Users, and Roles in the Keycloak server
Select the Create button to add a new client. Set the following
wso2apim-samlsamland Save.
In the next screen, add the following to configure our wso2apim-saml client in the Keycloak
WSO2 APIM SAML ClienttruesamltruetrueRSA_SHA1NONEEXCLUSIVEtruetruetrueusernamehttps://localhost:9443/commonauthhttps://localhost:9443/commonauthand under Fine Grain SAML Endpoint Configuration
https://localhost:9443/commonauthhttps://localhost:9443/commonauthand Save.
Next, click on the Roles tab to create a role in Keycloak server representing the Subscriber role in the WSO2 API Manager
Click on Add Role to create a new Role and fill the following …
subscriberand Save
We have now successfully configured our APIM SAML Client wso2apim-saml in the Keycloak Server. Next, we will be creating a new user to do our test runs.
Select the Users under the Manage section in the Left Navigation Panel and you will find a similar screen as follows
Smash the Add User button and feed the following
keycloakuserkey@cloak.comKeycloakUsertruetrueand Save.
Move to the Credentials tab and enter a password for the created user. Disable the Temporary Password and click on the Set Password.
Then, move to the Role Mappings tab to map our Subscriber role with the newly created User.
Select the wso2apim-saml client in the Client Roles dropdown and then select the subscriber roles under the Available Roles section and click on the Add Selected to assign it.
Now, we have successfully created a temp user to perform our test runs. Next, we want to configure the scopes which are related to SAML in the Keycloak server to send all assigned Roles.
Select the Client Scopes listed under Configure section and Edit the role_list scope.
Go to the Mappers section and click on Edit to edit the default configured Mapper to send the Roles which are assigned to the User and the application as SAML Response
Make the Single Role Attribute to true and Save.
This is because, as default Keycloak server will send back the SAML Response with multiple Role attributes.
If we enable the Single Role Attribute, a single attribute named Role will be passed along with the associated roles as its child element.
and as one last step in the Keycloak server, we need to get the public certificate of the Keycloak server.
Go to the Realm Settings under Configure and select the Keys tab. Click on the Certificate of the RS256 Algorithm and copy the cert value to a text editor.
Add the -----BEGIN CERTIFICATE----- and -----END CERTIFICATE----- to the copied value respectively at the beginning and at the end and save it as keycloak.cert
Following is the default Keycloak server’s Public Cert
-----BEGIN CERTIFICATE-----MIICmzCCAYMCBgFxK7QtbzANBgkqhkiG9w0BAQsFADARMQ8wDQYDVQQDDAZtYXN0ZXIwHhcNMjAwMzMwMTM0NzQwWhcNMzAwMzMwMTM0OTIwWjARMQ8wDQYDVQQDDAZtYXN0ZXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCNH2xuTvfh4+GMhXnawavMi+Ro02XmtH5GDYR9MU+ERV1tm5ZqEDEERD7XPAMh5xjZn7iN0Wqp8x8j68Cy+k3Z8o3HanO/YShd+QBzU4JQ4VuhS8Kvn/KRiIUPA7NkD/o/TmopWWrxho/hj3HfJm82mKAMGKUsfMLOH8Iy+8Q106QrgeN0FWaseiqfBMAlaRrGDI4VsPAlHvT+JbL8NNgQB1gEIn6hhwFVbzHcofOXrRj1kpO9Vmd5VmdDtMorGrxrLyBhE4/opl22jvHgS8Ae3/R0kCiw81NZpxYieiz+kpUxDU95BG0twkwdMMJYt7YAm48qyD5knoOKmkLtLpqxAgMBAAEwDQYJKoZIhvcNAQELBQADggEBACLoLH+DiVVcngWGcGMdaLHjBt/DwmMHbfBlcwZZJ8q3W8vFB6CZQqVUtaEDPolj6FpdSzHUxZGEDuRINr1I/n9QIoofhgZNXuUpn0FMjH5RZa1kkvkxbTOOjSzuLh76gqpJchmbthUBPwrOtZ5oE8y2LenF4TzrZsDuEiSgwFtQNpbvoJbZ7iofVuV+C7evzwIZUmAI14jQ1EcPGJtb7aSzP2GkVH3zmXO48wLWUKcKXYIt7kJYiZPjwN0m0v/cwAI7Td1VtlA0hc4FIGhc8ouVoYd9DMDDklKJOgGeM9xK0nH6URtutQsmf+3cn19XA1VIS12C0eLkJpqK5Bw/lWY=-----END CERTIFICATE-----
👏 👏 👏 one domain is done.
Next, we will be moving to the WSO2 API Manager to configure an Identity Provider and a Service Provider to perform Federated SAML2 SSO.
Fire-up the WSO2 API Manager server and navigate to the Carbon Management console and login with your admin credentials.
Click on Add under Identity Providers section and feed the following Basic Information
KeycloakSAMLIDPKeycloak SAML IDPSelect the IDP Certificate as Upload IDP Certificate and upload the keycloak.cert that we have created in the previous steps.
Next, expand the Claim Configurations and map our Role claim with the Internal Role claim.
Select the Define Custom Claim Dialect and click on Add Claim Mapping and enter the following
Role : http://wso2.org/claims/roleSelect the Role in the Role Claim URI dropdown as well
Then, expand the Role Configuration accordion and enter the following to map the subscriber role of the Keycloak with the Internal/subscriber role of the API Manager
subscriber : Internal/subscriberNext, click and expand the Federated Authenticators section and SAML SSO to configure the Federated authentication with our Keycloak Server
Put the following in the respective fields
truewso2apim-saml (our client name in the Keycloak Server)urn:oasis:names:tc:SAML:1.1:nameid-format:unspecifiedhttp://localhost:8080/auth/realms/master (Entity ID can be found in the SAML Metadata of the Keycloak)http://localhost:8080/auth/realms/master/protocol/saml (SSO URL can be found in the SAML Metadata of the Keycloak)Finally, expand the Just-In-Time Provisioning and select the Always Provision to User Store Domain to PRIMARY and Provision Silently
and Save.
Attached is a full-snap of the configurations 😍 👌
We are done with the Identity Provider configurations. Now, we have to create and register a Service Provider to SSO with the API Store node.
Log-in to the Carbon Management console and click on the Add under the Service Providers section and enter the following in the following screen
API_STOREand Register.
On the following screen, expand the Inbound Authentication Configuration and select the OAuth/OpenID Connect Configuration to configure an OAuth app.
As default the WSO2 API Manager doesn’t support the SAML2 Web SSO Configurations in Service Provider. Hence, we are configuring an OAuth service provider to perform SSO with the API Store
On the prompted screen add the following
https://localhost:9443/store/jagg/jaggery_oidc_acs.jagand Save.
Next, expand the Local & Outbound Authentication Configuration and select our KeycloakSAMLIDP as the Federated Authentication and Register (Save).
As always, I have attached the full-snap of the Service Provider configuration below 🤓
👉 Before moving to the next part, make a note or copy the client_id and the client_secret which are generated in our Service Provider as we need ’em when configuring the site.json.
We are in the latter part of our demo flow.
As the last part, now we have to configure the site.json related to the Store node to communicate with our Service Provider.
The Store will start to communicate with our Service Provider and it will start to communicate with our Identity Provider and finally, our Identity Provider Federates with the Keycloak Server
Phew …. 🤓😅😅
Open-up the WSO2 API Manager’s directory and move to <apim>/repository/deployment/server/jaggeryapps/store/site/conf and open the site.json to configure the OIDC
Given below is a complete segment of the OpenID Connect configuration model in the site.json. You can refer to the following to configure your site.json in your environment.
Replace the Client ID and Client Secret with the credentials acquired from the API_STORE Service Provider
Also, if you notice, I have used
usernameClaimproperty in the OIDC Configuration to look for thesubclaim to acquire the username for our Store node. As default it will be referred to thepreferred_usernamefield. In SAML2 SSO Federation thepreferred_usernamefield is not guaranteed when provisioning the Users. Hence, it is required to configure theusernameClaimproperty in the OIDC configuration
"oidcConfiguration" : {"enabled": "true","issuer": "API_STORE","identityProviderURI": "https://localhost:9443/oauth2/token","authorizationEndpointURI": "https://localhost:9443/oauth2/authorize","tokenEndpointURI": "https://localhost:9443/oauth2/token","userInfoURI": "https://localhost:9443/oauth2/userinfo","jwksURI": "https://localhost:9443/oauth2/jwks","logoutEndpointURI": "https://localhost:9443/oidc/logout","authHttpMethod": "POST","usernameClaim": "sub","clientConfiguration" : {"clientId" : "Client ID","clientSecret" : "Client Secret","responseType" : "code","authorizationType" : "authorization_code","scope" : "phone email address openid profile","redirectURI" : "https://localhost:9443/store/jagg/jaggery_oidc_acs.jag","postLogoutRedirectURI" : "https://localhost:9443/store/","clientAlgorithm" : "RS256"}}
We have successfully configured SAML2 Federated Authentication between Keycloak and Single Sign-On with OpenID Connect with API Store. Next, we will be doing a small test drive…
👏 👏 👏
Direct to the Store portal using https://localhost:9443/store/ and click on Sign-In.
You will be redirected to the Keycloak’s login page to enter the credentials. Enter the credentials of our Keycloak User and then allow the attributes on the consent screen to continue with the federation and provision of the Keycloak users to the WSO2 API Manager.
Login to the Carbon Management console of WSO2 API Manager and list the Users. If the Federation is successful and JIT Provisioned performed without any errors, you will be able to see our Keycloak User in the prompted list.
Happy Stacking !!!! 🤘 ✌️