Category Archives: How-to

Blast from the past: Configure K2 SmartForms for AAD Authentication (4.7)

DISCLAIMER: This is a post which used to be published on another web site, and as it is no longer available there just re-publishing it here again. It is an old write up from summer 2017, so a lot of things surely have changed since then.

In my previous article –  Azure AD instance set up basic walkthrough, I covered process of setting up of an Azure Active Directory (AAD) instance and also such basic things as subsequent AAD user creation, joining Windows 10 device to AAD and configuring logon to Windows 10 device using AAD account. 

In this blog post I decided to put this AAD instance to more serious/interesting use and configure K2 SmartForms for AAD authentication. When configured, such AAD integration allows AAD users to login to K2 SmartForms web sites (Runtime, Designer, Management) and enables K2 use AAD users as destination users in workflows’ client events or pull users details via Azure Active Directory Service broker and respective SmartObjects. 

When you use SharePoint Online with K2 you get your AAD authentication configured automagically (see, for example, this blogpost which run through the steps involved), and it really means that once you activated K2 App on your SharePoint online site – things gets configured automatically on K2 side. Simplicity of this integration emphasizes current product focus on clients which use SharePoint Online in their environments. 

Things are a little bit different when you do not have (or do not want to use) SharePoint Online in your environment, but still need AAD users to interact with K2. Good news – this is something you can do, bad news – current K2 documentation has not been updated to reflect AAD side UI and terminology changes and all in all it is quite lengthy manual configuration process. So vendor documentation is in place and you may follow it along but like I said current edition needs to be updated a bit, but no worries we will cover everything here, simplifying (when possible) steps involved and using modern Azure Portal UI. 

This article assumes that you have K2 4.7 installed and configured in your environment with on-premise AD or K2 SQL authentication and now just want to add AAD integration. 

Beyond installed and configured K2 blackpearl and K2 SmarForms our prerequisites are AAD subscription (this has been covered in my previous article) and SSL configuration of K2 web sites (as usual for test purposes you can get away with self-signed certificate, and this is also covered in K2 Installation and Configuration Guide). 

There are two big parts in setting up K2 and AAD integration: registering K2 SmartForms app in AAD and K2 side configuration of OAuth Resource and AAD label. 

Let’s start with registering K2 SmartForms app in AAD. In the real world you may not have access to AAD and somebody else will have to perform these steps for you. But, in any case, once app registered you will need certain values from registered K2 app which used to perform K2 side configuration. For the sake of convenience those will be written IN BOLD CAPITAL LETTERS and I suggest you create some table or text document which you can fill in as you go through AAD app set up part and then use it while performing K2 side configuration. 

Our first step is to log on to https://portalazure.com, select AAD domain and click on App registrations link under Manage

It will open App Registrations page where you need to click on “New application registration” button: 

This button starts Create app wizard where you are filling in application name, leaving application type on its default value of “Web app / API” and specifying Sign-on URL as shown below: 

Once app has been created you can see it in the list of your apps: 

If you click on it you can see your newly created app properties page: 

We now can further configure app and take a note of details we will later need to use on K2 side, for now from the Settings page copy and save your APPLICATION ID value. For additional properties and settings, use Settings pane on the right. For example, we can add customized logo for our app as shown below (that comes in handy if your list of registered apps is large, as logo helps you to find your app somewhat quicker in App Registrations list): 

While we still have app properties blade open we can adjust App ID URI replacing GUID which goes after K2 site part of URL and changing it to something less lengthy and easier to read for human. In my case I’ve changed it to “/identity/” (as you can see on the screenshot above). NOTE: This App ID URI must be unique within your AAD instance (UI won’t allow you to enter duplicate). Also on this page be sure to set Multi-tenanted option to Yes. 

Once again be sure to save APPLICATION ID into your app info table, and then click on Keys under API ACCESS section: 

There you need to type in description and select expiration time for the key, and click on Save to retrieve the key value: 

Once you click on Save, copy and save the key into table. Important warning: You will not be able to retrieve the key value once you leave this page so make sure you have it stored/copied: 

Once you copied and saved the KEY VALUE to table you can navigate away from this blade. As you can see on the screenshot above Azure UI additionally warns you that you will not be able to retrieve the key value once you leave this blade so make sure you that you saved it.  

If you navigate away from this blade and return to it you will see that key value is hidden and there in no options to retrieve it: 

Now from the app properties page click on Settings, then on Reply URLs and add two additional reply URLs (make sure to adjust {YourK2Server} value as necessary, in my case K2 server name was “k2.zlatagroup.com”, for example). So https://{YourK2Server}/runtime should be already here and you need to add the following:  

Token Endpoint Reply URL – https://{YourK2Server}/identity/token/oauth/2 

Authorization Endpoint Reply URL – https://{YourK2Server}/identity/authorize/oauth/2 

After this your Reply URLs list should look as on the screenshot below, and you can click on Save: 

Let’s also make sure that we have required app permissions. For that we need to navigate to Required permissions and then add/edit Windows Azure Active Directory permissions: 

Here we need either grant (Add button) or make sure (click on “Windows Azure Active Directory” permissions entry) and ensure that the following permissions are granted for K2 app: 

As a final touch we need to configure our AAD App to allow us to log in against all our K2 sites by modifying the app manifest file. Click on edit app manifest button: 

Within manifest file locate “identifierUris” section and append it so that it lists all your K2 sites, as shown on the screenshot below:  

Now we need to click on Endpoints button from the App registrations blade list: 

It will open Endpoints information page, from which you need to copy and save the following items: Federation Metadata Document URL, the OAuth 2.0 Token Endpoint, and the OAuth 2.0 Authorization Endpoint URL (the GUID section of all these URLs is your Directory ID). 

After saving endpoints information we need to obtain and store the Certificate Thumbprint. For that we need to navigate to Federation Metadata Document URL of our AAD using web browser and once XML is loaded search for X509Certificate value (within the Signing container) and copy it: 

You just copy entire line between <X509Certificate> and </X509Certificate> tags. Next Open a browser and browse to the online SAML fingerprint tool, paste the copied X509Certificate value into the form and make sure the sha1 algorithm is selected, then click the Calculate Fingerprint

Save FINGERPRINT VALUE. This concludes AAD app configuration part. After completing it you supposed to have this data: 

  • APPLICATION ID. Referred as Client ID in old Azure UI/K2 documentation. You can get it from app properties blade in AAD. Used as Authorization, Token and Refresh value of client_id OAuth resource property in K2. 
  • KEY. Key value which must be copied from the App Keys page at the stage of key creation. Used in all values of client_secret OAuth resource property in K2. 
  • METADATA URL. Can be copied from App Registrations > Endpoints page. 
  • OAUTH AUTHORIZATION ENDPOINT. Can be copied from App Registration > Endpoints page. Used when adding New OAuth Resource in K2. 
  • TOKEN ISSUER ENDPOINT. Can be copied from App Registration > Endpoints page. Used when adding New OAuth Resource in K2. 
  • DIRECTORY ID. GUID part which can be found in abovementioned endpoint URLs, or in Azure Active Directory Properties. Used as token value of resource_id OAuth resource property in K2.  
  • FINGERPRINT VALUE. Can be generated with SAML fingerprint tool from <X509Certificate> value of your app federation metadata document. 

Now we are done with AAD side app switch over to K2 Management site. As our first step here, we need to Register an OAuth Resource in K2. To do that we navigate to Authentication > OAuth > Resources and click on New button: 

This will open New OAuth Resource window where you need to type in resource name, select Microsoft Online as a resource type and enter Authorization and Token Endpoint values we recorded during AAD app registration. We leave Use Host Server Authorization Endpoint checkbox unchecked and click on OK button (see screenshot below). 

Our next step is to edit client_id resource parameter, which you can select from the list of Resource Parameters and then click Edit as shown below: 

Once client_id edit dialog has been opened we just need to paste APPLICATION ID we saved during AAD app registration in all three fields of this box, i.e. we use it as a value for Authorization, Token and Refresh: 

We next need to edit number of other parameters in the same fashion. We edit api_version resource parameter entering “1.0” for all values: 

Next, we edit scope resource parameter entering reader as Authorization Value as shown below: 

For all values of client_secret enter KEY we saved during AAD app registration: 

We specify https://graph.windows.net for all values of resource parameter: 

For redirect_uri we enter https://{YourK2Server}/identity/token/oauth/2 as Authorization and Token value: 

For entity_id parameter we entering DIRECTORY ID of your AAD instance as a token value: 

After all these edits you Resource Parameters for AAD resource should look like this: 

We now ready to add AAD security label in K2 (you can use something other than “AAD” as label name). For this we need to execute this SQL script or use sample script from K2 Installation and Configuration guide adjusting values for @OAuthProviderName and @SecurityLabelName variables. Be sure to back up your K2 database as you supposed to do before any direct modification of K2 database (I hope this is already your habit? If not try to form it 😊). 

Once script has been executed, we need to restart K2 service to get this new label initialized/picked up by K2. 

Our next step is to add new claim issuer from K2 Management site, as shown below: 

You need to specify the following values there: 

For Issuer value you specify https://sts.windows.net/{DIRECTORY_ID}/, for URI value you specify https://login.windows.net/{DIRECTORY_ID}/wsfed. As a Thumbprint value you need to paste your FINGERPRINT VALUE. Pay attention to trailing slash in Issuer URL – do not omit it. 

Next step is configuration of the Claim Mappings in K2. Claim mappings are used to identify the incoming claims and map them to the appropriate K2 security label. To do that we navigate to Claims, click New, select label and issuer we created earlier and fill in the form as shown on the screenshot below. We need to type in User and Group token identifiers and fill in all values under Identity Provider along with Original Issuer and Claim Type values under Identity section (see screenshot below). 

Now we need to configure the Realms and Audience URIs linking them with new issuer. For that, we navigate to K2 Management > Authentication > Claims > Realms and for each and every realm enable our AAD issuer, by means of selecting realm entry, clicking Edit and checking newly created issuer in Linked Issuers list: 

Hooray! We can now navigate to our SmartForms URL and select our AAD and logon with AAD credentials: 

Once label is selected you are redireted to Microsoft login page (https://login.microsoft.online.com) where you need to type in your AAD credentials and click Sign in: 

What you going to see next obviously depends on which K2 site you were trying to access. If it was K2 Designer then it will be opened without further questions in the default configuration: 

But in case you try to open K2 Management you are going to get insufficient permissions message: 

Which nudges us to perform our final configuration step. As we don’t have K2 Management rights we need to go and grant them, right? But as soon as you attempt to do it you will see that at this stage you are unable to do it: 

Error message tells us that OAuth token requires authorization and comes from K2 URM Service. It means that we need to obtain OAuth token for K2 service account (URM Service runs in the context of this account). To do that perform the following steps: 

1) Run SmartObject Services Tester (“C:\Program Files (x86)\K2 blackpearl\Bin\SmartObject Service Tester.exe”) in the context of your K2 service account using standard Windows “Run as different user” option. 

2) Now the tricky part. Unfortunately, now, in K2 4.7 SmartObject Services Tester only allows you to perform authorization redirect only when you are creating new instance (this possibly will be addressed in upcoming K2 Five release). Thus, to get our K2 Service account token instead of touching URMService we will simply register new Azure Active Directory service instance (and you may want to have it anyway): 

In Add Service Instance dialog we just switching Authentication Mode to OAuth, selecting our OAuth Resource (“AAD”) and typing https://graph.windows.net as OAuth Resource Audience value. We do not touch any other settings leaving them on default values as illustrated below. 

Once you click on Next, you will get this message (once again this message appears only when you are adding new instance, not editing existing one!): 

Once you hit OK browser window will be opened where you need to type in your AAD credentials. Important: you need an AAD user with Global administrator directory role for this action, otherwise you are going to see the following error: 

If you remember one of the rights we granted to our app is “Read directory data” and as it is a directory wide access only global admin AAD user can grant consent to this right: 

Once you type in your AAD global admin user credentials you just need to confirm that we are granting permissions mentioned above to the app: 

Once you click on accept you should be redirected on your K2 Identity site (you may get Windows credentials prompt at this stage – type in your K2 service account credentials) and see “Authorization Successful” message: 

This means that K2 service account token has been created and cached on your K2 server and you can see it in K2 Management > Authentication > OAuth > Tokens: 

3) You can now get back to SmartObject Services Tester and click on Next, Add to finish creation of AAD Service Instance: 

We now completed all the configuration steps and can grant rights to AAD users and use them in all K2 user pickers: 

It is good time to switch over to our Windows10 machine where we enabled AAD logon (see my previous blogpost) and look how it works there. 

First, we can conveniently see our K2 app in Access Panel application in our web browser. Just open https://account.activedirectory.windowsazure.com in your browser and without any credentials prompts (remember we are logged on to Windows 10 device with AAD credentials) you can see this: 

At this point I had realized that I have published K2 runtime site here, which is of little use as entry point for users, but you can correct this and publish either K2 Designer or K2 Management here. But in any case, from this Windows 10 machine we can navigate to K2 Management or Designer sites after just selecting AAD label and without typing in any credentials. 

I should say that the way this integration looks now in K2 4.7 is a bit inconvenient and lengthy. There are a lot of manual steps where you can easily make small mistakes which prevent your entire set up from working correctly, but with some experience you can do it. I think we have these manual configuration steps just because there was much more focus on SharePoint online AAD integration from K2 side and little attention to AAD without SharePoint online integration scenario. But in case a lot of clients will be asking vendor to simplify and better support this AAD only integration scenario, this can be improved and simplified in response to that. 

In any case I think this article gives a very good example of using AAD as an authorization provider for K2. I hope it was informative and useful and in case you have any questions you may leave them in the comments section below. 

Unable to update Skype on Ubuntu 20.04 – GPG/signature error

Some time ago I’ve noticed that Skype UI on my Ubuntu machine was insisting on the need to apply updates constantly, and required message was in place in spite of running sudo apt update / sudo apt upgrade. After looking more carefully at sudo apt update output it turned out to be an issue with repository signature:

Exact error message text was the following:

W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: https://repo.skype.com/deb stable InRelease: The following signatures were invalid: EXPKEYSIG 1F3045A5DF7587C3 Skype Linux Client Repository <se-um@microsoft.com>
W: Failed to fetch https://repo.skype.com/deb/dists/stable/InRelease  The following signatures were invalid: EXPKEYSIG 1F3045A5DF7587C3 Skype Linux Client Repository <se-um@microsoft.com>
W: Some index files failed to download. They have been ignored, or old ones used instead.

To resolve this problem it is necessary to perform the following steps:

1) Delete incorrect signature key:

sudo apt-key del 1F3045A5DF7587C3

2) Re-add new valid key:

curl https://repo.skype.com/data/SKYPE-GPG-KEY | sudo apt-key add -

3) Re-run apt update and apt upgrade:

sudo apt update && sudo apt upgrade

That should remove Skype update errors.

Clearing GitHub repo history

Sometimes one can commit a code with some (relatively) sensitive info into a public git repository. Typical first action in such scenario is to do a new commit with sensitive data removed, but one can be slow to remember that public GitHub repository has its commit history visible to everyone so irrespective of new commit with removed sensitive data it is still exposed. Once you realize that you may want to delete repository commit history. Unfortunately this is not something that you can through GitHub UI with one button click, but you can do this using sequence of git commands shown below.

I’m sure there are other scenarios when you may need to use these commands too, so just sharing it here.

Running CentOS 8 with Oracle VirtualBox

Recently it was necessary for me to prepare couple of VMs with CentOS Linux 8 to do some labs/practice, and in this blog post I just want to share my notes about the process/steps involved into creating CentOS 8 VM using Virtual Box.

My base OS is Ubuntu 20.04, so I first needed grab DEB package with the latest version of Oracle Virtual Box from official downloads page. I then grabbed full x86-64 ISO file of CentOS Linux 8 (CentOS-Stream-8-x86_64-20210427-dvd1.iso) from CentOS downloads page to avoid any potential need for extra downloads during installation process.

After installing DEB package I quickly created new VM using the following options:

Creating VirtualBox VM – Name and OS
Creating VirtualBox VM – Memory Size
Creating VirtualBox VM – Hard disk
Creating VirtualBox VM – Hard disk file type
Creating VirtualBox VM – Storage on physical hard disk
Creating VirtualBox VM – File location and size

After creating VM I’ve started mounting CentOS iso file and selecting Install CentOS Linux 8

Starting CentOS 8 installation process

For my purposes it was OK to accept defaults for almost everything. English US for language settings:

CentOS 8 installation – language settings

I only changed installation type from default Server with GUI to Minimal Install and further assigned Root Password and configured Installation Destination with default options:

CentOS 8 installation – Installation Summary

Setting up weak root password (which is OK for test box) requires you to click Done twice:

CentOS 8 installation – Root Password

And for disk option it is OK to just accept defaults:

CentOS 8 installation – Installation Destination

With all settings in place we just hit begin Installation and wait/taking a coffee break 🙂

CentOS 8 installation – Installation Summary

It is now only a question of observing installation progress for some time and hitting Reboot System bottom at the very end of the process:

CentOS 8 installation – Installation Progress
CentOS 8 installation – Installation Completed

Once installation is over and system is rebooted we need to logon and install updates/make sure we have Internet connection, but if we run yum check-update immediately after logon we will see that VM has no internet access:

yum check-update – no connectivity

As you can see from the output we cannot connect/resolve host name to check for updates, so let’s check network status with nmcli general command:

Network connection status (nmcli general)

As you can see interfaces are enabled but we have no connectivity, basically it is because VM didn’t receive IP configuration from DHCHP and running dhclient -v command should resolve that (v flag only indicates that we need detailed output from this command):

Checking connection status after running dhclient -v

After that we can re-run nmcli general – state should change to connected and yum check-update or yum update commands should work just fine:

Running yum with working connection

But what I noticed is that after every reboot of VM network connection was again getting back to disconnected state, although yum check-update / yum update commands were not reporting connectivity errors, checking with nmcli general or with curl -I https://mikerodionov.com was showing that I can’t connect and dchclient command was helping only until next reboot. I checked network-scripts folder and interface configuration file did had BOOTPROTO=dhcp option which supposed to be responsible for use of DHCP at boot stage, but ONBOOT setting was set to no – changing it to yes made connectivity available immediately after reboot.

To edit these settings you can use vi as shown below:

Using vi to edit network configuration scripts
Configuration with ONBOOT option changed to yes

After that the only basic thing you may want to do is to adjust/verify hostname of VM which you can do with hostamectl command as shown below:

Changing and viewing hostname

With that we have CentOS 8 VM with internet connectivity and updates and at it is good idea to create baseline snapshot of VM at this stage. I guess these notes may come in handy to somebody else, especially final part on network configuration.

Removing K2 node from K2 farm

Just a quick note on removal of a node(s) from K2 servers farm. When you run K2 uninstall on one of the nodes, and obviously when you suddenly lose one of your nodes (server failure without ability to restore it), information about it still stored in K2 database and additional steps are required in that scenario.

To reiterate, just running K2 uninstall on the node does not remove references to the node from K2 database.

To clear that up there is a stored procedure Server.kClusterDown which removes references to the node you removing from all the relevant tables:

Server.ProcInst
Server.DestQueue
Server.Async
Server.IPCAsync
Server.ClusterMessage

It sets Running=0 for node you want to remove in Server.Server table, and then updates all references to the server ID of the server you want to delete with ID of server which you keep.

You run this stored procedure specifying IDs (note: IDs not sever names) from Server.Server table as a parameters:

@ServerID = NEW SERVERID / ID OF THE SERVER WHICH STAYS IN YOUR FARM
@ClusterServerID = OLD SERVERID / ID OF THE SERVER WHICH YOU REMOVE FROM YOUR FARM
@ServerDownTimeout = 0

As usual before attempting any direct modifications on K2 system database you should back it up beforehand.