I have set a personal goal to avoid creating more than a single store for Storefront. With that, I’ve been working on customizing Storefront for our organization and occasionally a problem comes up that requires a unwieldy solution… Like creating multiple stores.
An example of this is we have an application that configures itself based on the CLIENTNAME variable. The current solution for this problem is to provide ICA files with CLIENTNAME preconfigured. The application is launched, detects the client name variable then displays the relevant data.
Really, this is a pretty terrible way for the app to configure itself.
You would hope the application would have been coded to accept a switch or something for configuring it and then just publish out the application(s) instead.
But, I’m not the developer of this application and have to come up with a solution that works within this framework. The initial thought was we can enable ‘overrideicaclientname’ and then modify the default.ica files with the hard coded client name. Then we’d create as many stores as is required to support the different configurations… Then direct users to the different URL based on their needed configuration…
If this is starting to sound ugly, it’s because it is.
Citrix provides some guidance for manipulating the CLIENTNAME. Unfortunately, the manipulation of the CLIENTNAME in the example would not be sufficient. We need to configure it to be a specific string and all the examples within are dynamically generated.
Fortunately, Citrix CTP Sam Jacobs has come to the rescue and extended the work of Simon Frost. Sam’s addition was to accept a custom HEADER and configure the CLIENTNAME on that value. This sounds perfect. I think I can configure a custom header during the launch of a specific application, and StoreFront will take that name, configure the CLIENTNAME and voila!
So how would you do this? Jason Samuel goes over the configuration of the necessary steps (it’s in both Sam and Simon’s posts as well, but I found Jason’s post more clean and clear). The exception is (step 6 in Jason’s post) the clientNameRewriteRule needs to be set with the custom header we are going to look for.
My instructions are:
- Edit “C:\inetpub\wwwroot\Citrix\Store\web.config” (note: this is the “STORE” web.config and not the STOREWEB)
Configure a section “appSettings” to be like so:
XHTML123<appSettings><add key="clientNameRewriteRule" value="$H'NewClientName' " /></appSettings>
- Find the “overrideIcaClientName” and ensure it’s set to “on”:
XHTML1<launch setNoLoadBiasFlag="off" addressResolutionType="DNS-port" requestICAClientSecureChannel="Detect-AnyCiphers" ignoreClientProvidedClientAddress="off" overlayAutoLoginCredsWithTicket="off" overrideIcaClientName="on" requireLaunchReference="on" allowFontSmoothing="on" showDesktopViewer="off" allowSpecialFolderRedirection="off" vdaLogonDataProvider="">
- Edit “C:\inetpub\wwwroot\Citrix\StoreWeb\web.config” (note: this is the “STOREWEB” web.config)
Add a ‘forwardedHeaders’ section under “communication”
XHTML123<forwardedHeaders><header name="NewClientName" /></forwardedHeaders>
- Edit the “C:\inetpub\wwwroot\Citrix\StoreWeb\custom\script.js” file and add the following:
- Download Sam’s “StoreCustomization_Input.dll” from here and overwrite the placeholder located here:
And? Did it work?!
Look at that! It works! Splendid!
And now I can configure ClientName based on the application that is launched! So now we do not need to create multiple stores, we can keep this to a single store and it’s more dynamic and cleaner (IMHO). The only caveat is upgrading Storefront these steps may need to be done again as the web.config files may be cleaned or reset.
UDPATE! I found that customizations were being inconsistently applied! Check this post for further details and a possible fix!