Thank you for joining us for our first London Technical User Group of the year on February 26, 2020. This was my first technical talk at a Sitecore User Group event. And I would like to share my experience with you.
Blank Canvas
So, where do you start? Perhaps the most difficult part is finding out a topic to speak about. I could imagine this resonates with you too. I decided to talk about Sitecore Host because I believe it is an area that relatively new and has not been blogged about as much. It also gave me chance “learn by doing” as I needed to demonstrate one or two highlight features of Sitecore Host.
Nailing your topic
Having nailed the topic, I embarked on reviewing as much documentation as I could to get content for my own talk. I also planned out the various scenarios for my technical demos. Naturally, I went for Sitecore Horizon 9.3 being the new kid in the block in the Sitecore Host front. For comparison, I also went for Sitecore Identity Server, which also gave me the opportunity to demonstrate creating and extending Sitecore Host Plugin another highlight feature for me.
So, what is your story?
The next thing was to come up with a story on why I believe Sitecore Host is so cool. For me, what is interesting about Sitecore Host is as follows:
Sitecore have created a pluggable architecture that gives us a framework we can extend safely using .NET Core hosting bundle.
Sitecore is already doing cool stuff with this framework, Sitecore Horizon 9.3, Sitecore Identity and Universal Tracker Service
Sitecore Identity Server as a federation gateway can be extended to work with ADFS, and many more external providers
So, what is the big deal? Well, if you were to implement support for ADFS in a Sitecore version prior to Sitecore Identity Server, it won’t take you hours, we are talking weeks in fact. That is a big deal for me and my clients. So, I did an experiment and timed myself. The results are out – and it took me under 2 hours to create ADFS Host plugin!!!
I also got a chance to share my gotchas during my preparation, which are now available for you to view on my series of blog posts accompanying the talk.
Talking the talk
And on the actual event, how do you execute your talk? How do you keep the time? Oh well this was the tricky part as I had to restart my Sitecore instances in multiple occasions during the demos…and you know how slow the instances can be in your local dev environment. That is not very time efficient. Perhaps I needed to borrow a leaf from Jeremy Davis style of presenting with pre-recorded screen capture videos of demos. And with subtle pauses which allowed him to talk about the key points, without demo getting on his way. I think I will try this next time.
I also got some constructive feedback which I would like to share with you:
“Talking through code is tricky – Even though this is a technical user group, there are some non-technical people in the audience. Whilst it’s ok for them not to follow, you don’t want this to last too long or they get their phones-out.”
“Naturally when talking through code, you have to focus on what you are talking though – physically looking at your machine. This means you are dis-engaged from the audience (think about body language) – the aim is to be able to talk through code whilst barely even looking away from the audience.“
Happy my first talk is in my back pocket now. I can’t wait for another opportunity to do another presentation in future User Group event.
The second Sitecore User Group event will be in Manchester is on Wednesday March 11, 2020 week. Grab your ticket and join the Sitecore community over there who will be digging into testing personalization and optimization, using Docker with Sitecore and have a look at the new Horizon editor.
In this four part series of blog posts, we will examine in detail the Sitecore Host platform and what benefits this brings to Sitecore Experience Platform. We will also have a closer look at Sitecore Host Applications as well as the Sitecore Host plugins. I will encourage you to please read through these blog posts starting with part one, through part four. I have also provided links below if you would like to jump and have a peek on the other parts as well. All code snippets referenced in the blog posts can also be found on my public Github repo using the link provided below.
You can define a Sitecore Host Plugin as a feature or functionality that is dynamically loaded into Sitecore Host. As you will see later on, a plugin can contain Code, Configuration, Commands and Content. A plugin can also depend on another plugin, and therefore plugins are always loaded in a dependency order.
Definition of a Sitecore Host Plugin
Creating a Visual Studio Project
Ensure you have installed Visual Studio version 2017 and above. To create a Sitecore Host Plugin in Visual Studio, follow the steps below:
Create a Class Library project targeting .NET Standard 2.0 framework, as shown below. Simply filter project templates by language preference, platform and project type. There is also a text box where I have filtered by “class library”
Visual Studio 2019 – create new project dialog
Select the highlighted template and then assign the project a uniquely identifiable name (this will be the plugin unique name). After you have successfully created your project, it is time to verify the Target Framework has been set correctly. This can be done by viewing the project properties as shown below.
Right-click on the project name
Select the properties menu item
Which should open the dialog shown below. Adjust appropriately if this is different in your case.
Visual Studio – .NET Standard 2.0 target framework
Then create a global.json file at the root of the project. This will specify the version of Sitecore.Framework.Runtime.Build package, which is required when creating plugins. It provides MSBuild targets to support creating Sitecore plugins
Edit the csproj file and add this line below after the Project node
The final csproj file should look like the one below
Then add necessary references to required Packages, such as shown below.
You will notice I am additionally referencing Microsoft.AspNetCore.Authentication.WsFederation package needed for Web Services Federation functionality for ASP.NET core applications.
Now that we have a Visual Studio project for a Sitecore Host Plugin, we are going to create a external provider to allow us to use Ws-Federation protocol such as Active Server Federation Services (ADFS) with Sitecore Identity Server.
Define Plugin Configuration
The Sitecore Identity Server Plugin requires an XML based configuration based on Sitecore Identity Server template as shown below. In your Visual Studio project, create a solution folder named “Config“. Then add an XML file using the naming convention {Plugin_name}.xml where {Plugin_name} is the name of this project. So in our case, we will name it Avanade.Plugin.IdentityProvider.Ids4WsFederation.xml
In this configuration we will define the following:
“Sitecore:ExternalIdentityProviders:IdentityProviders:Ids4WsFederation” – the configuration section name. Please note Ids4WsFederation is the section name for the xml tag.
AuthenticationScheme – this is IdS4-Ids4WsFederation The second part Ids4WsFederation much be same as the section name for the xml tag (by convention)
DisplayName – This is the caption for the Login button that will appear on Sitecore Identity login page
Enabled – This is the flag that enables the subprovider when set to true
Wtrealm – This is the Ws-Federation or ADFS Relying Party URI as configured on your ADFS instance.
ClaimTransformations – This section is used to place transformation rules for how source claims from Ws-Federation or ADFS will be mapped into Identity Server normalised claims. Sample claim transformations have been provided in the source code in my public GitHub Repo
Mapping Plugin Configuration into C# models
In your Visual Studio project, create a class named Ids4WsFederationIdentityProvider.cs that inherits from the Sitecore.Plugin.IdentityProviders.IdentityProvider. Notice the class name has a suffix of IdentityProvider as a recommended naming convention.
In this class we will define two properties of type string: MetadataAddress and Wtrealm. This are the additional properties we need from our configuration file above, the rest of the properties are defined in the base Sitecore.Plugin.IdentityProviders.IdentityProvider class.
Provide definition of ConfigureServices for the Plugin
As per Sitecore Host Plugin requirements, we need to configure services for the subprovider according to the instructions for this provider, and specify the SignInScheme setting as idsrv.external
To use authentication middleware, we must have an object of the type Microsoft.AspNetCore.Authentication.AuthenticationBuilder
To initialise this object, we must use
new Microsoft.AspNetCore.Authentication.AuthenticationBuilder(services)
instead of services.AddAuthentication()
Notice how we use AuthenticationBuilder(services).AddWsFederation() pipeline below, which is available to us via the Microsoft.AspNetCore.Authentication.WsFederation package we referenced earlier.
Below is the full code listing of the required implementation
Configure Services code listing
Define Sitecore.Plugin.manifest file for the Plugin
Finally we need to define the Plugin manifest file, which looks like the screenshot below.
Sitecore.Plugin.manifest file definition
The manifest file defines the following properties for the plugin
PluginName – Unique and identifiable name for the plugin
AssemblyName – This is the name of the Class Librabary
Dependencies – a list of other plugins your plugin depends on. In our case, this is depending on Sitecore.Plugin.IdentityProviders version 4.0.0-r00257
Tags – This is by default set to “Sitecore”
Your final Visual Studio Project structure should be similar to the one shown in the screenshot below. This code is also available on my public Github Repo
Building your Plugin Nuget package and deploying it
You can manually publish your project to generate a Nuget package for your plugin.
Right-click your project in Visual Studio, then choose Publish… menu item. Follow the steps to publish the code to a staging folder.
And then you will publish a standard Nuget package located within publish sub-folder shown below:
Deploying your Plugin Manually
Plugins are distributed as Nuget packages. To add a plugin to a host application so that it is loaded at runtime, the plugin must be unpacked and have its assets copied to the correct locations.
Create an environment folder
If you do not have one already, you need to create an environment folder under the sitecoreruntime folder. A Sitecore Host application will default its environment to Production. Unless a different environment is supplied at startup (via the –env command) it will look for the production folder first:
For example: hostapp/sitecoreruntime/production
Create a plugin folder
You need to create a folder for the plugin (in our case name it Avanade.Plugin.IdentityProvider.Ids4WsFederation) . This is where the plugin manifest, assets and configuration are located. This is located inside the sitecore folder, which is inside an individual environment folder
The sitecoreruntime/<env>/sitecore folder does not override files in the hosts sitecore folder. This is a unique folder used for loading plugin assets.
Runtime environment folders cannot contain a sitecoreruntime folder of their own.
Unpack plugin data from a Nuget package and deploy it
We have our plugin named Avanade.Plugin.IdentityProvider.Ids4WsFederation.1.0.0.nupkg
Unpack the plugin contents. You will notice our package contains special sitecore directory in the root of the nupkg package with additional things inside it. Everything else is the standard Nuget structure.
Copy the contents of the Nuget sitecore folder to the plugin folder you created previously (for example, sitecoreruntime/production/sitecore/Avanade.Plugin.IdentityProvider.Ids4WsFederation).
Our plugin package contains a lib folder, copy the assets from the correct target framework to the root of the sitecoreruntime/<env> folder (for example, sitecoreruntime/production/*.dll)
Our plugin package contains a content folder, copy the assets from this folder to the plugin folder created previously (for example, sitecoreruntime/production/sitecore/Avanade.Plugin.IdentityProvider.Ids4WsFederation)
The final folder structure will looks similar to this below
Ws-Federation subprovider in Action
After successful deployment of this plugin to your instance of Sitecore Identity server, you should see the Login screen below.
Please note you will need to re-start your IIS to pick the plugin changes.
SI with additional provider for ADFS
Troubleshooting plugin
If you encounter any issues with your ADFS plugin, it is possible that the claims mappings have issues. Please refer to the Claims Troubleshooting section on previous blog post for some tips on resolving potential issues.
Conclusion
In this blog post, we examined creating and extending Sitecore Host plugins. We walked through the process of creating your .NET Core project in Visual Studio. We also walked through the actual code samples required to extend the Sitecore Identity with a new subprovider for Ws-Federation (ADFS). The code samples used in this blog post is also available in this GitHub Repo
This is the final blog post of this four-part series. I hope you found it useful and given you some motivation to go and start creating cool Sitecore Host Plugins.
Please feel free to leave us your feedback and/or comments below.
In this four part series of blog posts, we will examine in detail the Sitecore Host platform and what benefits this brings to Sitecore Experience Platform. We will also have a closer look at Sitecore Host Applications as well as the Sitecore Host plugins. I will encourage you to please read through these blog posts starting with part one, through part four. I have also provided links below if you would like to jump and have a peek on the other parts as well. All code snippets referenced in the blog posts can also be found on my public Github repo using the link provided below.
Sitecore Identity Server is a mechanism to log in Sitecore for both Sitecore Users & External Users
Key Highlights
Introduced in Sitecore 9.1 and it builds on Federated Authentication introduced in Sitecore 9.0
It is based on IdentityServer4 which is an OpenID Connect and OAuth 2.0 framework for ASP.NET Core
Acts as a federation gateway to configure multiple identity providers
As a federation gateway, this enables developers to focus on customization. This means IdentityServer can be customized to fit your Your developers can write code to adapt into what makes sense in your scenarios
In Sitecore 9.1 and later, Sitecore Identity enabled by default
Enabling Azure Active Directory (AzureAd) Identity Provider
By default, IdentityServer comes with AzureAd Identity Provider that is disabled. You can enable this provider using the following steps.
Locate the Sitecore.Plugin.IdentityProvider.AzureAd plugin on your IndentityServer instance as shown in screenshot below:
AzureAd-HostPugin-Location
Open and edit the Sitecore.Plugin.IdentityProvider.AzureAd.xml config file and supply the values as follows
DisplayName – specify the caption of the login button, for example “Login with Azure AD”
Enabled – set this to true
ClientId – specify your Azure registered Application ID. More guidance about this is provided later in this blog
TenantId – specify your Azure Tenant ID for your registered application. More guidance about this is provided later in this blog
ClaimsTransformations – specify claim mappings of AzureAd source claims to Sitecore Identify normalised claims. As a federation gateway, IdentitySever shields your client applications from the complexities of external providers by performing a claim transformation to what Identify server has control over.
Configuring Claims Transformations
By default, Sitecore Identity operates with the following custom scopes: sitecore.profile as an identity resource and sitecore.profile.api as an API resource.
You can find default scope definitions in the {SI_server_root_folder}\sitecore\Sitecore.Plugin.IdentityServer\Config\identityserver.xml file.
The sitecore.profile and sitecore.profile.api scopes both contain the following claims:
The screenshot below shows examples of mapping AzureAd specific claims into normalised claims above in IdentityServer
AzureAd-ClaimTransformation
To give users roles:
Map a particular incoming claim to the appropriate role claims. The above screenshot shows an example of transforming the 8b0acd88-5eaf-4776-a637-d2952f2321ae Azure AD group to the sitecore\Developer role role
To make a user an administrator:
Add http://www.sitecore.net/identity/claims/isAdmin and set the value to true (being an admin user in Sitecore is not about having a particular role). The screenshot above shows an example of making all users from f30226fc-16e1-4d7e-bf5d-2f4b8df553aa Azure AD group into Sitecore Administrator users
Mapping the IdentityServer normalised claims into Sitecore
Normalised claims are mapped into Sitecore using the configuration: sitecore:federatedAuthentication:propertyInitializer:maps node.
The {Sitecore_Instance_Root_Folder}\App_Config\Sitecore\Owin.Authentication.IdentityServer\Sitecore.Owin.Authentication.IdentityServer.config file has an example of this, as shown below:
If you have configured everything as expected, then you should see an additional login button on your IdentityServer login page as shown below
Azure AD subprovider
Clicking on the “Azure AD” button will redirect you to the AzureAd login page, from which you can then login with your AzureAd users
Sitecore user name generation
Once successfully logged in via AzureAd external provider, you should have this user persisted within Sitecore User Manager. The screenshot below shows a sample user from AzureAd
Sitecore-Owin-Auth-ExternalUserNames
User names must be unique across a Sitecore instance. You cannot use user names from different external providers as Sitecore user names because this does not guarantee that the user names are unique.
The DefaultExternalUserBuilder class creates a sequence of user names for a given external user name. It then uses the first of these names that does not already exist in Sitecore. The values in the sequence depend only on the external username and the Sitecore domain configured for the given identity provider.
Should you choose to customise your user names, you can provide your own implementation, such as the one suggested in Sitecore.StackExchange.com
Please note the default implementation is provided in Sitecore.Owin.Authentication.dll
Then you will need to register your custom implementation within the configuration file {Sitecore_Instance_Root_Folder}\App_Config\Sitecore\Owin.Authentication\Sitecore.Owin.Authentication.config
Claims mappings troubleshooting using ASP.NET 2.0 Membership Tables
When performing end to end testing with your AzureAd external provider, you may come across issue with claim mappings into IdentityServer. The good news is that all the source claims originating from AzureAd are captured and stored in the Core database, within the ExternalUserData table, as shown in the screenshot below
Asp.Net2.0Membership-ExternalUserDataTable
Each external user successfully persisted will have an entry in this table, and the [Data] column has the JSON payload of their source claims, which looks like in the screenshot below
Sitecore-Owin-Auth-ExternalUser-SourceClaims
Ensure your IdentityServer claim mappings match those in this Json, otherwise your mapping will not work.
Conclusion
In this blog post, we examined what is Sitecore Identity Server in detail and explored the powerful feature of federation gateway. We also explored the default use case of Azure Active Directory and how to configure Sitecore Identity to work with Azure AD as external identity provider
In the fourth and final part of this four-part series, we will examine Creating and Extending Sitecore Host Plugins in detail. We will walk through creating a Sitecore Identity subprovider plugin for Active Directory Federation Services (ADFS)
Please feel free to leave us your feedback and/or comments below.
In this four part series of blog posts, we will examine in detail the Sitecore Host platform and what benefits this brings to Sitecore Experience Platform. We will also have a closer look at Sitecore Host Applications as well as the Sitecore Host plugins. I will encourage you to please read through these blog posts starting with part one, through part four. I have also provided links below if you would like to jump and have a peek on the other parts as well. All code snippets referenced in the blog posts can also be found on my public Github repo using the link provided below.
Sitecore Horizon 9.3 is a new alternative approach to editing Sitecore content, that is now available in Sitecore XP 9.3 and later. It is a light-weight Angular-based application which features a Page Editor, Page Insights and a Simulator.
The screenshot below shows the icons for Page Editor, Page Insights and Device Simulator.
Horizon client app is built with Angular 7.2 utilizing Node.js for server-side rendering. It uses GraphQL-based backend API to communicate with backend
What you can do with Sitecore Horizon 9.3
At the time of writing this blog, with the Sitecore Horizon Page Editor, you can do the following
Create a page or folder. Can only create a page if Insert Options have been defined at that level
Edit text and image fields only
Image dialog features a cool dynamic image search
Build simple layouts – without complex rendering properties
A facility to use drag and drop when adding renderings to a page
You can move items through workflow if configured
You can publish content, this will use current language version plus all related items (NOT sub-items)
Uses smart publish meaning will only publish if their has been changes since last publish
Rename page or folders – which will update the item Display Name (not item name)
With Sitecore Horizon Page Insights, you can do the following
view page analytics and insights
Use Sitecore Host Plugins to extend the page insights
With Sitecore Horizon Device Simulator, you can do the following
It allows page previews with different device types
Can rotate the device in portrait and landscape modes
What you can NOT do with Sitecore Horizon 9.3
As of the time of writing this blog, Sitecore Horizon 9.3 has some compatibility issues with some of the Sitecore features and service as follows:
Sitecore Experience Accelerator (SXA) supports basic page editing with Horizon
Sitecore Horizon does not support editing of rendering parameters
You can not change layout and composition of page within Horizon, use Experience Editor instead
Sitecore Horizon has limited support for JavaScript Services (JSS) sites such as you can open JSS site but cannot edit fields on pages
Sitecore Horizon is not compatible with Sitecore Publishing Service
You will get error trying to publish content via Horizon on an instance with Publishing Module enabled
Horizon does not support Internet Explorer or Safari on MacOs
Extending Sitecore Horizon using Host Plugins
Sitecore Horizon Page Insights is one area that can be extended to have more page analytics displayed on the Page Insights. Out of the box, Sitecore have provided the Sitecore.Horizon.Insights.Plugin which comes with five insights as shown below.
Horizon-page-insights
Conclusion
In this blog post, we examined what is Sitecore Horizon 9.3 in detail and explored what you can and can not do with it. This being the initial release, I would encourage you to download your copy and play with it further so we can give feedback to Sitecore. I expect Sitecore to enhance this Module in coming releases as well as seeing cool Sitecore Host Plugins created by the community to enhance it.
Introduction to Sitecore Host, Sitecore Host Applications and Sitecore Host Plugins
In this four part series of blog posts, we will examine in detail the Sitecore Host platform and what benefits this brings to Sitecore Experience Platform. We will also have a closer look at Sitecore Host Applications as well as the Sitecore Host plugins. I will encourage you to please read through these blog posts starting with part one, through to part four. I have also provided the links below if you would like to jump and have a peek on the other parts as well. All code snippets referenced in the blog posts can also be found on my public Github repo using the link provided below.
Sitecore Host part one – Introduction to Sitecore Host, Sitecore Host applications and Sitecore Plugins (this post)
Sitecore Host in a new common platform for all Sitecore Services, that was introduced in Sitecore Experience Platform 9.1. Sitecore Host acts as a base for a Sitecore Service and it requires .NET Core runtime and hosting bundle 2.1
Sitecore Service is a feature or piece of functionality that runs separately outside of main Sitecore instance
One cool benefit that Sitecore Host provides is the pluggable nature of its architecture. This means the base Sitecore Services can be extended through Sitecore Host Plugins, without having to change or recompile any part of the base code.
What is Sitecore Host Plugin?
You can define a Sitecore Host Plugin as a feature or functionality that is dynamically loaded into Sitecore Host. As you will see later on, a plugin can contain Code, Configuration, Commands and Content. A plugin can also depend on another plugin, and therefore plugins are always loaded in a dependency order.
What is Sitecore Host Application?
Sitecore Host Application is therefore a fully hosted application that consists of the Sitecore Host base code plus one or more Sitecore Host plugins. It consists of the following parts: Root folder, Application Assets Folder, Sitecore folder and SitecoreRuntime folder.
Sitecore Host applications includes:
Universal Tracker Service
Sitecore Identity Server
Sitecore Horizon 9.3
Sitecore Host Directory Structure
Root Folder
All code libraries/DLLs including the .NET Core runtime
The Host DLL itself (E.g. Authoring.Host.dll)
Optional configuration file for Sitecore Host itself (sitecore.xml)
Optional environment-specific configurations, e.g. sitecore.production.xml for production environment
Application Assets Folder
Contain the Sitecore Host Application Core assets such as Configuration files
Content folders
MVC views folders
Sitecore Folder
Contains Sitecore Host plugin libraries supplied by Sitecore
Contains the Sitecore Host plugin manifest files plus any additional assets such as configuration files
SitecoreRuntime Folder
Special folder to extend or modify base Sitecore Host application
Contains custom Sitecore Host plugins, such as those created by developers
Each folder acts as a store for an environment
Structure mirrors main Host application
Cross-platform support
In Windows environments, these applications are hosted as Internet Information Services (IIS) websites as the .NET Core hosting bundle comes with IIS Support. As .NET is cross-platform, these applications can be hosted using the Kestrel web server on Linux and macOS
Other Sitecore Host Benefits
Sitecore Host platform comes with many benefits to both the businesses as well as to the developers building cool stuff with Sitecore.
Unified service registration and Dependency Injection
Unified configuration system that is merged and patched the same way
Unified file system access and directory structure
Unified Command-line actions that work the same way for all applications
Dynamically loaded plugins
Cross-platform ready – the services behave the same way whether run on cloud or on-premises, in Windows, Linux or macOS workloads
Installation experience is consistent
Conclusion
In this blog post, we examined what is Sitecore Host, Sitecore Host applications and their composition and directory structure. We also had an introduction to Sitecore Host plugins and the extensibility the framework introduces to Sitecore Host. We finished with some of the benefits Sitecore Host brings.
Sitecore Horizon 9.3 (referred as Horizon for brevity in this blog) is the new alternative approach to editing content that is now available together with release of Sitecore Experience Platform 9.3 since late November 2019. Horizon is a separate Module that can be installed and is hosted separately from the main Sitecore XP 9.3 instance.
Sitecore previously announced Horizon in Symposium 2017 with a preview version released with Sitecore XP 9.1
The new editing environment in Sitecore XP 9.3, known as “Horizon” offers brands an easy to use, intuitive, and contextual interface with everything a user needs for easy navigation. The new editor user interface sets a foundation for the future and also provides real-time contextual insights as content is created and published, giving marketers the knowledge they need to drive improved conversions
~~~~
Sitecore official Symposium 2019 announcement
Horizon architecture at a glance
Horizon introduces a new IIS website instance, the content Authoring host application
Horizon deploys an integration module to every CM instance
Horizon client application is built with Angular 7.2 utilizing Node.js for server-side rendering
Horizon client application uses GraphQL-based backend API to communicate with backend. This is similar to Sitecore JSS services
HTTPs requirement for communications between CM instance and the Authoring host application
User authentication via the Sitecore Identity Service
As prerequisite you must install Sitecore Experience Platform 9.3 or later. Also verify that
Sitecore CM instance has HTTPS enabled
Sitecore Identity must be installed
WebSocket Protocol is enabled in Windows Server Manager. Please see the screenshot below, where you need to tick to enable this feature and update your system.
Unpack the Sitecore Horizon 9.3.0.zip package to a working folder (as shown in screenshot below). You will then need to update the parameter.ps1 PowerShell script with parameters for the following:
ContentManagementInstanceName – specify CM instance name
ContentManagementWebProtocol – this must be HTTPS
SitecoreIdentityServerPhysicalPath – specify path to Identity Server
SitecoreIdentityServerPoolName – specify Identify Server application pool name
SitecoreIdentityServerSiteName – specify Identity Server site name
LicensePath – specify your license full path (including file name)
AuthoringHostName – (recommended authoringhost.cmdomain.com as sub-domain of CM instance)
After you save your changes to parameter.ps1 PowerShell script, simply run the install.ps1 PowerShell script from your command prompt or PowerShell command to install Horizon
Below is a sample parameters.ps1 script with the parameters specified. Notice the license path must include the file name.
Sample parameters.ps1 script with values
Whilst Horizon is installing, you will see the progress screen similar to the one shown below
Horizon installation in progress
Launching Sitecore Horizon
Sitecore Horizon 9.3 once successfully installed can be launched from the Launchpad of your main Sitecore XP 9.3 as shown below
Click on Horizon “missile” icon to launch the Horizon Authoring host application, as shown below
Congratulations! You have successfully installed Horizon when you see the above page. You will notice that Horizon is opened on a separate tab from your main Sitecore instance Launchpad
What changes does Horizon introduce to wwwroot
As mentioned above in the architecture at a glance, Horizon create a new IIS website as well as integration module to every CM instance.
Below is a screenshot showing IIS websites before and after Horizon is installed.
IIS Websites before horizon
And below are the changes to your main Sitecore instance (wwwroot changes).
Red highlight indicates the file(s) were modified. Blue/Purple indicates new files were introduced
wwwroot changes introduced by Horizon to CM instance
And below are the changes to your Sitecore Identity server (wwwroot changes).
Red highlight indicate the file(s) were modified.
Troubleshooting Installation Issues
You may come across installation issues. Below is how you can troubleshoot them
Node.js issues
You may come across Node.js issues which means Horizon will not load successfully when launched. You may get the error message below on your browser after launching Horizon
Failed to render a page: InternalServerError when launching Horizon, see screenshot below
You may get exceptions reported in the logs similar to this one below
An unhandled exception was thrown by the application. System.InvalidOperationException: Failed to start Node process. To resolve this:. [1] Ensure that Node.js is installed and can be found in one of the PATH directories. Current PATH enviroment variable is: Make sure the Node executable is in one of those directories, or update your PATH.
To resolve the Node.js issue, try the following options:
A) If you are using Node.js version management utility (NVM) to manage your NodeJS versions, ensure you have given the IIS application pool permissions to your NVM Roaming folder. Below is a screenshot showing how to give permissions
setting permission on nvm roaming folder
B) If you are not using NVM, then please try uninstall Node.js and then re-install it again using the Windows Installer. Please refer to the Sitecore Horizon 9.3 Installation guide on the required Node.js version
Enabling logging on Authoring.Host.dll
Horizon logs are written on the logs sub-folder located at the wwwroot of the Horizon instance, as shown below:
update web.config to enable logs
If you can’t see any log files in the logs sub-folder, you can update the web.config file located at the wwwroot of the Horizon instance as shown below. Simply set the stdoutLogEnabled =”true” save your changes, and then recycle the Horizon app pool
Hope you find this post useful. Please watch this space as I will blog more about Horizon, including a deep dive on its features among other areas.
A guide to installing by Sitecore Install Assistant
Sitecore Experience Platform (XP) 9.3 was released late November 2019. In this blog, I will walk you through installing this release on your local on-premises development or testing environment.
The team at Sitecore have done a great work in documenting what is new in this release which I highly recommend you review as well.
Without further ado, I will now jump straight into installing a brand new instance of Sitecore XP 9.3
Sitecore® Experience Platform™ 9.3 focuses on product updates and enhancements that increase usability and improve performance – all centered around making it easier and faster to build digital experiences so brands can accelerate their time to value. The new editing environment offers an intuitive interface with everything a user needs for easy navigation as well as real-time contextual insights as content is created and published, giving marketers the knowledge they need to drive improved conversions.
Getting required downloads and installation package
We will be using Graphical setup package for XP Single option. Download this package to your computer. The package is a zip file named Sitecore 9.3.0 rev. 003498 (Setup XP0 Developer Workstation rev. 1.1.1-r4).zip
Extract the package and launch Sitecore Install Assistant (SIA)
Ensure you “unblock” the zip package as shown in the screenshot 1 below
Then extract the zip package to your working folder as shown in screenshot further below
Screenshot 1 – unblock the package before extracting the contents
Review prerequisites and requirements
Sitecore XP 9.3 supports the following database servers:
Microsoft SQL Server 2016 SP2 and 2017 – This is required if you are going to use SQL Server for the Experience Database (xDB).
MongoDB Server 4.0.5 – This is required if you are going to use MongoDB for the Experience Database (xDB) or as a Session State Provider.
Running setup.exe should launch the Sitecore Install Assistance, which I will walk through step by step below
Sitecore Install Assistant step by step
Click on Start button to advance to the Prerequisites screen
SIA prerequisites screen
This step will install the correct version of Sitecore Install Framework (SIF) and Windows Server prerequisites needed for Sitecore XP 9.3. Note if you already have SIF and Windows server prerequisites, you can skip this step
Once prerequisites are successfully installed, advance to the next screen to install Solr 8.1.1
Sitecore xP 9.3 requires Solr 8.1.1 search service. On this screen, specify the Solr port, Windows Service and Install path and then click install. If Solr 8.1.1 is already installed, you can skip this step by clicking on the Skip button.
SIA Solr 8.1.1 installing
SIA Solr 8.1.1 install complete
You can verify Solr 8.1.1 is successfully installed and running at this point by accessing the URL https://localhost:8983/solr/#/ (please note the port number configured in previous screen). You should see a page similar to one below
Solr 8.1.1 portal up and running
Once Solr 8.1.1 is successfully installed, advance to next screen to configure Sitecore Settings
Installation/solution prefix – specify a prefix to be added to names of Sitecore instance, SQL databases and Solr cores
Sitecore admin password – specify a strong password for Sitecore instance admin account
Sitecore license file – specify the full path including the filename for your license file
Click next to advance to SQL Server settings screen
Specify the name of the SQL Server instance, the admin user (sa) and admin user password. Then click Next to advance to Solr settings screen
SIA Solr 8.1.1 settings
On this screen enter the Solr 8.1.1 setting
Solr service URL – should be https://localhost:8983/solr (note the port number if different)
Solr file system root – enter your the path to Solr 8.1.1 you installed previously
Solr Windows Service name – enter the Solr windows service name configured previously
Click Next to advance to next screen for Optional modules
You can skip Sitecore Experience Accelerator (SXA) as we don’t need it in this case
The summary screen showing list of the settings you specified. Allows you to verify everything is correct, if not use the Back button to go back and edit them. Once happy click on Next button to advance to Validate screen
The installer validates you have
Sitecore license file
SIF configuration files
WDP files
Once validated you should see green ticks against each item, then click Install to initial the install process
The installation may take about 15-30 minutes depending how quickly the install operations execute on your system
If everything goes to plan, you will see the installation completed message. Then click Next to advance to Installation completed screen, with a link to Launch Sitecore
Post Install Notes
SIA graphical setup tool was introduced in Sitecore XP 9.2 It is nice to see some impovements to this tool, such as optional installation of Solr and SXA.
I hope this guide here gives you motivation to go and try this on your own.
Once again, visit Sitecore XP 9.3 Release Notes page for a full list of hightlights, new features or impovements, any deprecated features among others
So I write software for a living. I have been doing this for more than 10 years. I have written all sorts of web applications while working for different organisations. I also write Windows native apps on my own spare time.
I believe there are many ways to deliver a software project, hence the phrase there’s more than one way to skin a cat! However from time to time we choose to do things in a certain way based on several factors. For me, productivity has to be on top of the list.
Below I share my top 10 .NET web development tools that make me more productive in the software projects I do.
Text editors and IDE
Textpad – This is a free simple and yet a very powerful text editor for quickly editing your code files including web pages. It features a powerful expression engine compatible with Perl and Javascript with syntax highlighting. It can handle very large file sizes and can be handy for quick find and replace tasks in large text based files
Notepad++ – This a free source code editor which is optimised to ensure higher execution speed and smaller program size. It is very hand if you want to develop in other languages other than English
Visual Studio – Probably the best IDE available and very popular with MSDN community. Powerful, Versatile and Extensible tool enabling building apps for any platform
Brackets – This is a very modern open source text editor that understands web design. A lightweight, yet powerful tool if you need an easy way to get a quick, clean, minimal CSS HTML document flow going.
Typography for the web
Adobe Typekit – Visually design and package beautiful fonts you want, anywhere, anytime
Google Fonts – Probably doesn’t require much introduction. Just Google it J
Font squirrel – If you need 100% free fonts for commercial use then you’ve got it. Visually design and package your fonts
Modular Scale – So have you ever wondered why they use Pixels, Ems and not Inches? And do you know what is Ems@16 ?This utility will help you convert between these units, and scale up or down your font sizes while keeping meaningful ratio between them
Adobe Color CC – Talk of colour schemes or themes, this tool from Adobe allows you to visually play with various to achieve the best contrast for your brands
CSS with vertical rhythm – If you have designed for the web then probably this is one of your favourite tools. If you have not used it, try it you won’t regret it.
CSS and styling
Bootstrap – Probably the most popular HTML, CSS and Javascript framework for developing responsive, mobile first brands. Its open source and available on GitHub.
CSS Reset – Get yourself scripts to quickly reset your styling of all HTML elements to a consistent baseline. You never need to scratch your head again asking Which CSS Reset should I use?
Browser reset – Another free browser reset script to get you started if you want to reduce browser inconsistencies in things like default line heights, margins and font sizes of headings, and so on
Entity Framework
MvcScaffolding NuGet package – This is a fast and customizable way to add controllers, views, and other items to your ASP.NET MVC application. You will love this at first sight.
EF Power Tools Visual Studio extension – There we go again. I love code first and not database first. Well, if you got an existing database or go for database first, this extension will reverse engineer an existing database and get you all those POCOs
EF Profilerby hibernating rhinos – Unfortunately you will need to pay for this tool but you won’t regret it. Using Entity Framework means much of the database work happen under the covers. Now you got a tool to profile all that.
Regex
Learn, build, & test Regular Expressions – This is a very handy tool to quickly build and text RegEx before you include them in your source code. You can also choose for an existing list of commonly used RegEx such as the one for validating an email address. It comes with excellent text editor with highlight syntax for all the RegEx matches.
Source code re-factoring and experience
ReSharper – This probably does not require much introduction. A popular productivity tool for Visual Studio, improving navigation within your project code files, code inspection and refactorings.
Source code repository
GitHub – Everyone is using it. If you can’t beat them you can as well join them.
Visual Studio Online – Not to be confused with Visual Studio IDE, this cloud based solution allows you to host your source code on the cloud for free for 5 basic user licences
Rich media
Windows snipping tool – Allows you to quickly capture screen shots on your desktop
Pixlr – Free and yet powerful online tool to quickly edit your rich media without installing anything
Paint net – A free image and photo editing software for your desktop
Console and Scripting Tools
Cmder. A nice looking and portable console emulator for Windows. It looks very sexy from the start
Windows PowerShell – We all love the power of scripting in Windows. Quickly create and test PowerShell scripts for automating your tasks
Online resources and Collaboration
Programming books repository on GitHub has a comprehensive list of books for almost anything you will ever need to know about programming.
Stackoverflow – It does what it says on the tin. We have all gotten or seen a “Stack overflow “error at some point. If you got any questions on anything programming related, Stackoverflow has got the answer for it already. You don’t believe me? Just try them.
Are you already using Azure Mobile Services for Windows 8 and Windows Phone 8? It doesn’t matter what your response is. Geoff Webber-Cross’s “Learning Windows Azure Mobile Services for Windows 8 and Windows Phone 8” book got all answers to all your questions. Whether it is your first time or a seasoned developer already using Azure Mobile Services, you will learn a thing or two from this book.
This book is a short, fast and focused guide to enhance your Windows 8 applications by leveraging the power of Windows Azure Mobile Services
What I like most about this book is the approach the writer has taken from the very chapter of the book. We have a real-life problem to solve by leveraging Azure Mobile Services. Here is short extract on the problem.
The TileTapper game consists of a grid board seeded from a simple Boolean array of
active or inactive tiles. When the app launches, it prompts the user to log in using the
Windows Live connect authentication provider, downloads levels and current high
score from our back end service, and then begins the game.
So as you progress through the chapters, the writer solves the problem by show casing each aspect of Azure Mobile Service is applied. It also comes with access to the source code for each chapter – so essentially you can dry run through the code as you read the contents of the book.
I am not a first time user of Azure mobile services, but I have learned a few tips and tricks on how to design apps leveraging the power of Windows Azure Mobile Services.
I recommend this book to any developer leveraging the power of Windows Azure Mobile Services