Do not input private or sensitive data. View Qlik Privacy & Cookie Policy.
Skip to main content

Announcements
ALERT: The support homepage carousel is not displaying. We are working toward a resolution.

Customizing Qlik Sense Enterprise on Windows Forms Login Page

100% helpful (2/2)
cancel
Showing results for 
Search instead for 
Did you mean: 
Sonja_Bauernfeind
Digital Support
Digital Support

Customizing Qlik Sense Enterprise on Windows Forms Login Page

Last Update:

Aug 14, 2025 1:55:54 AM

Updated By:

Sonja_Bauernfeind

Created date:

Aug 9, 2022 10:26:10 AM

Ever wanted to brand or customize the default Qlik Sense Login page?

The functionality exists, and it's really as simple as just designing your HTML page and 'POSTing' it into your environment.

qlik login page default.png

We've all seen the standard Qlik Sense Login page, this article is all about customizing this page.

This customization is provided as is. Qlik Support cannot provide continued support of the solution. For assistance, reach out to our Professional Services or engage in our active Integrations forum.

To customize the page:

  1. We highly recommend setting up a new virtual proxy with Forms so you don't impact any users that are using auto-login Windows auth.

    Example setup:

    Description: Custom Forms Page
    Prefix: customlogin
    Session cookie header-name: X-Qlik-Session-CustomLogin
    Windows authentication pattern: Forms

    setup custom login page in qmc.png

  2. Once this is done, a good starting point is to download the default login page.

    You can open up your web developer tool of choice, go to the login page, and download the HTML response from the GET http://<server>/customlogin/internal_forms_authentication request. It should be roughly a 273 line .html file.

  3. Once you have this file, you can more or less customize it as much as you'd like.

    Image files can be inlined as you'll see in the qlik default file, or can be referenced as long as they are publicly accessible. The only thing that needs to exist are the input boxes with appropriate classes and attributes, and the 'Log In' button.

  4. After building out your custom HTML page and it looks great, it needs to be converted to Base64. There are online tools to do this, openssl also has this functionality.

    Once you have your Base64 encoded HTML file, then you will want to PUT it into your sense environment.

  5. First, do a GET request on /qrs/proxyservice and find the ID of the proxy service you want this login page to be shown for.

  6. You will then do a GET request on /qrs/proxyservice/<id> and copy the body of that response. Below is an example of that response.

    {
        "id": "8817d7ab-e9b2-4816-8332-f8cb869b27c2",
        "createdDate": "2020-03-23T15:39:33.540Z",
        "modifiedDate": "2020-05-20T18:46:13.995Z",
        "modifiedByUserName": "INTERNAL\\sa_api",
        "customProperties": [],
        "settings": {
            "id": "8817d7ab-e9b2-4816-8332-f8cb869b27c2",
            "createdDate": "2020-03-23T15:39:33.540Z",
            "modifiedDate": "2020-05-20T18:46:13.995Z",
            "modifiedByUserName": "INTERNAL\\sa_api",
            "listenPort": 443,
            "allowHttp": true,
            "unencryptedListenPort": 80,
            "authenticationListenPort": 4244,
            "kerberosAuthentication": false,
            "unencryptedAuthenticationListenPort": 4248,
            "sslBrowserCertificateThumbprint": "e6ee6df78f9afb22db8252cbeb8ad1646fa14142",
            "keepAliveTimeoutSeconds": 10,
            "maxHeaderSizeBytes": 16384,
            "maxHeaderLines": 100,
            "logVerbosity": {
                "id": "8817d7ab-e9b2-4816-8332-f8cb869b27c2",
                "createdDate": "2020-03-23T15:39:33.540Z",
                "modifiedDate": "2020-05-20T18:46:13.995Z",
                "modifiedByUserName": "INTERNAL\\sa_api",
                "logVerbosityAuditActivity": 4,
                "logVerbosityAuditSecurity": 4,
                "logVerbosityService": 4,
                "logVerbosityAudit": 4,
                "logVerbosityPerformance": 4,
                "logVerbositySecurity": 4,
                "logVerbositySystem": 4,
                "schemaPath": "ProxyService.Settings.LogVerbosity"
            },
            "useWsTrace": false,
            "performanceLoggingInterval": 5,
            "restListenPort": 4243,
            "virtualProxies": [
                {
                    "id": "58d03102-656f-4075-a436-056d81144c1f",
                    "prefix": "",
                    "description": "Central Proxy (Default)",
                    "authenticationModuleRedirectUri": "",
                    "sessionModuleBaseUri": "",
                    "loadBalancingModuleBaseUri": "",
                    "useStickyLoadBalancing": false,
                    "loadBalancingServerNodes": [
                        {
                            "id": "f1d26a45-b0dd-4be1-91d0-34c698e18047",
                            "name": "Central",
                            "hostName": "qlikdemo",
                            "temporaryfilepath": "C:\\Users\\qservice\\AppData\\Local\\Temp\\",
                            "roles": [
                                {
                                    "id": "2a6a0d52-9bb4-4e74-b2b2-b597fa4e4470",
                                    "definition": 0,
                                    "privileges": null
                                },
                                {
                                    "id": "d2c56b7b-43fd-44ad-a12f-59e778ce575a",
                                    "definition": 1,
                                    "privileges": null
                                },
                                {
                                    "id": "37244424-96ae-4fe5-9522-088a0e9679e3",
                                    "definition": 2,
                                    "privileges": null
                                },
                                {
                                    "id": "b770516e-fe8a-43a8-a7a4-318984ee4bd6",
                                    "definition": 3,
                                    "privileges": null
                                },
                                {
                                    "id": "998b7df8-195f-4382-af18-4e0c023e7f1c",
                                    "definition": 4,
                                    "privileges": null
                                },
                                {
                                    "id": "2a5325f4-649b-4147-b0b1-f568be1988aa",
                                    "definition": 5,
                                    "privileges": null
                                }
                            ],
                            "serviceCluster": {
                                "id": "b07fc5f2-f09e-4676-9de6-7d73f637b962",
                                "name": "ServiceCluster",
                                "privileges": null
                            },
                            "privileges": null
                        }
                    ],
                    "authenticationMethod": 0,
                    "headerAuthenticationMode": 0,
                    "headerAuthenticationHeaderName": "",
                    "headerAuthenticationStaticUserDirectory": "",
                    "headerAuthenticationDynamicUserDirectory": "",
                    "anonymousAccessMode": 0,
                    "windowsAuthenticationEnabledDevicePattern": "Windows",
                    "sessionCookieHeaderName": "X-Qlik-Session",
                    "sessionCookieDomain": "",
                    "additionalResponseHeaders": "",
                    "sessionInactivityTimeout": 30,
                    "extendedSecurityEnvironment": false,
                    "websocketCrossOriginWhiteList": [
                        "qlikdemo",
                        "qlikdemo.local",
                        "qlikdemo.paris.lan"
                    ],
                    "defaultVirtualProxy": true,
                    "tags": [],
                    "samlMetadataIdP": "",
                    "samlHostUri": "",
                    "samlEntityId": "",
                    "samlAttributeUserId": "",
                    "samlAttributeUserDirectory": "",
                    "samlAttributeSigningAlgorithm": 0,
                    "samlAttributeMap": [],
                    "jwtAttributeUserId": "",
                    "jwtAttributeUserDirectory": "",
                    "jwtAudience": "",
                    "jwtPublicKeyCertificate": "",
                    "jwtAttributeMap": [],
                    "magicLinkHostUri": "",
                    "magicLinkFriendlyName": "",
                    "samlSlo": false,
                    "privileges": null
                },
                {
                    "id": "a8b561ec-f4dc-48a1-8bf1-94772d9aa6cc",
                    "prefix": "header",
                    "description": "header",
                    "authenticationModuleRedirectUri": "",
                    "sessionModuleBaseUri": "",
                    "loadBalancingModuleBaseUri": "",
                    "useStickyLoadBalancing": false,
                    "loadBalancingServerNodes": [
                        {
                            "id": "f1d26a45-b0dd-4be1-91d0-34c698e18047",
                            "name": "Central",
                            "hostName": "qlikdemo",
                            "temporaryfilepath": "C:\\Users\\qservice\\AppData\\Local\\Temp\\",
                            "roles": [
                                {
                                    "id": "2a6a0d52-9bb4-4e74-b2b2-b597fa4e4470",
                                    "definition": 0,
                                    "privileges": null
                                },
                                {
                                    "id": "d2c56b7b-43fd-44ad-a12f-59e778ce575a",
                                    "definition": 1,
                                    "privileges": null
                                },
                                {
                                    "id": "37244424-96ae-4fe5-9522-088a0e9679e3",
                                    "definition": 2,
                                    "privileges": null
                                },
                                {
                                    "id": "b770516e-fe8a-43a8-a7a4-318984ee4bd6",
                                    "definition": 3,
                                    "privileges": null
                                },
                                {
                                    "id": "998b7df8-195f-4382-af18-4e0c023e7f1c",
                                    "definition": 4,
                                    "privileges": null
                                },
                                {
                                    "id": "2a5325f4-649b-4147-b0b1-f568be1988aa",
                                    "definition": 5,
                                    "privileges": null
                                }
                            ],
                            "serviceCluster": {
                                "id": "b07fc5f2-f09e-4676-9de6-7d73f637b962",
                                "name": "ServiceCluster",
                                "privileges": null
                            },
                            "privileges": null
                        }
                    ],
                    "authenticationMethod": 1,
                    "headerAuthenticationMode": 1,
                    "headerAuthenticationHeaderName": "userid",
                    "headerAuthenticationStaticUserDirectory": "QLIKDEMO",
                    "headerAuthenticationDynamicUserDirectory": "",
                    "anonymousAccessMode": 0,
                    "windowsAuthenticationEnabledDevicePattern": "Windows",
                    "sessionCookieHeaderName": "X-Qlik-Session-Header",
                    "sessionCookieDomain": "",
                    "additionalResponseHeaders": "",
                    "sessionInactivityTimeout": 30,
                    "extendedSecurityEnvironment": false,
                    "websocketCrossOriginWhiteList": [
                        "qlikdemo",
                        "qlikdemo.local"
                    ],
                    "defaultVirtualProxy": false,
                    "tags": [],
                    "samlMetadataIdP": "",
                    "samlHostUri": "",
                    "samlEntityId": "",
                    "samlAttributeUserId": "",
                    "samlAttributeUserDirectory": "",
                    "samlAttributeSigningAlgorithm": 0,
                    "samlAttributeMap": [],
                    "jwtAttributeUserId": "",
                    "jwtAttributeUserDirectory": "",
                    "jwtAudience": "",
                    "jwtPublicKeyCertificate": "",
                    "jwtAttributeMap": [],
                    "magicLinkHostUri": "",
                    "magicLinkFriendlyName": "",
                    "samlSlo": false,
                    "privileges": null
                }
            ],
            "formAuthenticationPageTemplate": "",
            "loggedOutPageTemplate": "",
            "errorPageTemplate": "",
            "schemaPath": "ProxyService.Settings"
        },
        "serverNodeConfiguration": {
            "id": "f1d26a45-b0dd-4be1-91d0-34c698e18047",
            "name": "Central",
            "hostName": "qlikdemo",
            "temporaryfilepath": "C:\\Users\\qservice\\AppData\\Local\\Temp\\",
            "roles": [
                {
                    "id": "2a6a0d52-9bb4-4e74-b2b2-b597fa4e4470",
                    "definition": 0,
                    "privileges": null
                },
                {
                    "id": "d2c56b7b-43fd-44ad-a12f-59e778ce575a",
                    "definition": 1,
                    "privileges": null
                },
                {
                    "id": "37244424-96ae-4fe5-9522-088a0e9679e3",
                    "definition": 2,
                    "privileges": null
                },
                {
                    "id": "b770516e-fe8a-43a8-a7a4-318984ee4bd6",
                    "definition": 3,
                    "privileges": null
                },
                {
                    "id": "998b7df8-195f-4382-af18-4e0c023e7f1c",
                    "definition": 4,
                    "privileges": null
                },
                {
                    "id": "2a5325f4-649b-4147-b0b1-f568be1988aa",
                    "definition": 5,
                    "privileges": null
                }
            ],
            "serviceCluster": {
                "id": "b07fc5f2-f09e-4676-9de6-7d73f637b962",
                "name": "ServiceCluster",
                "privileges": null
            },
            "privileges": null
        },
        "tags": [],
        "privileges": null,
        "schemaPath": "ProxyService"
    }

     

  7. In the response, locate the formAuthenticationPageTemplate field

  8. You can then take your base64 encoded HTML file, paste the value into the formAuthenticationPageTemplate field. 

    Example:

    "formAuthenticationPageTemplate": "BASE 64 ENCODED HTML HERE",


    Once you have an updated body, you can use the PUT verb (with an updated modifiedDate) to PUT this body back into the repository. Once this is done, you should be able to goto your virtual proxy and you should see your new login page (very Qlik branded in this example):

    custom login page.png

If your login page does not work and you need to revert back to the default, simply do a GET call on your proxy service, and set formAuthenticationPageTemplate back to an empty string:

formAuthenticationPageTemplate": ""

 

Environment:

Qlik Sense Enterprise on Windows 

Labels (1)
Comments
doherja
Creator
Creator

Is this the same method needed if one wants only to change the default text?  Or is there a simpler method in such a case?  Thanks

doherja
Creator
Creator

When I get to this step: "you will then do a GET request on /qrs/proxyservice/<id> and copy the body of that response," rather than what is shown in the example, I see the HTML for the form login page, not Base64-encoded.  What does this mean?  Thanks

Sonja_Bauernfeind
Digital Support
Digital Support

Hello @doherja 

Let me reach out to my experts to get some clarity on this!

Tool_Tip
Creator III
Creator III

Dear Sonja

Can you please let us know more about this step 
"First, do a GET request  on /qrs/proxyservice and find the ID of the proxy service you want this login page to be shown for"

How can we get this ?

doherja
Creator
Creator

To @Tool_Tip 's question: I too did not find this ID in the results.  I retrieved the ID from QMC by turning on 'ID' in the Proxies page. From there, I followed the rest of the instructions both with this ID, and with the Description of the virtual proxy whose login page I wish to update.  Both gave me HTML results, with no body and no formAuthenticationPageTemplate, rather than what is shown above.

I think these instructions may no longer be current with the product, but I hope a new version can be posted soon, as there clearly others who want to update the login page.  In our case, our users need to log in with a different account from their usual one, so it is very important for us to be able to provide clear instructions on the login page.  Thanks

Tool_Tip
Creator III
Creator III

Hi Doherja,

 

Thank you for the information. So, without ID we can not proceed with rest of the steps given in above solution. 

What can be other possibilities to customize login page? Atleast is there a way to change highlighed message from login page some custom message such as "Username or password is incorrect"

Tool_Tip_0-1753847436374.png

Kindly suggest.

 

 

doherja
Creator
Creator

Tool_Tip, it sounds like your question is directed at me, but I am just another customer struggling to figure this out.  If anyone has succeeded in customizing this screen on a recent Sense version, please share what you did and how it is different from the instructions above.  Thanks!

doherja
Creator
Creator

@Sonja_Bauernfeind were you able to find any clarification on this?  Thanks!

Sonja_Bauernfeind
Digital Support
Digital Support

Hello @doherja!

I've updated the article with clarifications on the step you highlighted. Basically, you find the field in the initial response and then paste in your encoded page into the response.

If that is still the one you need help with. Note that, as this is a customization, this article is otherwise provided as-is.

If that doesn't get you where you need to be, our professional services can be engaged for direct assistance with this customization. See Professional Services. Alternatively, you can reach out to our larger user base with your customization requirement in the Integrations forum.

All the best,
Sonja

Tool_Tip
Creator III
Creator III

Dear Sonja

I have cretaed base64 file for my html page. But can you please help me to know how should I perfrom step 5 and 6 ? 

 

  1. First, do a GET request on /qrs/proxyservice and find the ID of the proxy service you want this login page to be shown for.

  2. You will then do a GET request on /qrs/proxyservice/<id> and copy the body of that response. Below is an example of that response.

 

Version history
Last update:
‎2025-08-14 01:55 AM
Updated by: