<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">Blog posts by Eric Herlitz</title><link href="http://world.optimizely.com" /><updated>2025-11-12T08:35:15.0000000Z</updated><id>https://world.optimizely.com/blogs/Eric-Herlitz/</id> <generator uri="http://world.optimizely.com" version="2.0">Optimizely World</generator> <entry><title>Handling Multiple OpenID Connect Providers in Optimizely CMS with .NET 8</title><link href="https://www.herlitz.io/2025/11/12/handling-multiple-openid-connect-providers-in-optimizely-cms-with-.net-8/" /><id>&lt;p&gt;When you need to authenticate against more than one OpenID Connect provider in the same ASP.NET Core app – say &lt;strong data-start=&quot;243&quot; data-end=&quot;262&quot;&gt;IdentityServer&lt;/strong&gt;&amp;nbsp;for the public site and &lt;strong data-start=&quot;287&quot; data-end=&quot;309&quot;&gt;Microsoft Entra ID&lt;/strong&gt; for Optimizely CMS – you quickly run into challenges: duplicate cookie schemes, mismatched role claims, and broken callback paths.&lt;/p&gt;</id><updated>2025-11-12T08:35:15.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Speeding Up Local Development with a Fake OpenID Authentication Handler</title><link href="https://www.herlitz.io/2025/10/20/speeding-up-local-development-with-a-fake-openid-authentication-handler/" /><id>&lt;p&gt;When working with OpenID authentication, local development often grinds to a halt waiting for identity servers, clients, and users to be configured. In this post, I’ll show how we built a lightweight &quot;local authentication&quot; module that mimics OpenID for development – no external dependencies required.&lt;/p&gt;</id><updated>2025-10-20T15:09:38.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Optimizely CMS in a terminal (console app)</title><link href="https://www.herlitz.io/2024/02/22/optimizely-cms-in-a-terminal-console-app/" /><id>&lt;p&gt;If you ever wanted an efficient and easy way to use the APIs and resources of an Optimizely CMS-project this is for you. No more database hacks to fetch or manipulate data.&lt;/p&gt;</id><updated>2024-02-22T08:04:52.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Implementing EmbeddedLocalization in Optimizely CMS 12</title><link href="https://www.herlitz.io/2023/01/27/implementing-embeddedlocalization-in-optimizely-cms-12/" /><id>&lt;p&gt;My previous post on translation (Translating Optimizely CMS 12 UI components) gives an overview of how to implement the FileXmlLocalizationProvider, how a folder structure can be implemented and some advice how to find the XML-elements to translate in the CMS UI. This post will cover how to implement the alternative of FileXmlLocalizationProvider which is the EmbeddedXmlLocalizationProviderInitializer or commonly implemented using the AddEmbeddedLocalization extension method.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id=&quot;gtx-trans&quot; style=&quot;position: absolute; left: 407px; top: 92.2px;&quot;&gt;

&lt;/div&gt;</id><updated>2023-01-27T12:25:19.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Translating Optimizely CMS 12 UI components</title><link href="https://www.herlitz.io/2023/01/26/translating-optimizely-cms-12-ui-components/" /><id>&lt;p&gt;Optimizely CMS 12 have been out for a while now, but still some elements haven&#39;t been properly translated resulting in a GUI defaulting to english. While that may be fine with many of us I still do have some customers who refuse to see the benefits of learning a bit of english. Anyways, it is good practice to implement translations of elements in all web sites which would include the Optimizely CMS GUI.&lt;/p&gt;</id><updated>2023-01-26T17:33:08.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Setting up the ImageEditor in Optimizely CMS 12</title><link href="https://www.herlitz.io/2023/01/25/setting-up-the-imageeditor-in-optimizely-cms-12/" /><id>&lt;p&gt;Setting up certain configurations on Opimizely CMS 12 differs quite a bit from prior versions of (Episerver CMS 11 and older). Here&#39;s a small guide on how to read and use the documentation from Optimizely regarding the ImageEditor.&lt;/p&gt;</id><updated>2023-01-25T17:44:23.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Resolving Optimizely CMS error &quot;InvalidOperationException: The view &#39;Bootstrapper&#39; was not found.&quot;</title><link href="https://www.herlitz.io/2023/01/20/resolving-optimizely-cms-error-invalidoperationexception-the-view-bootstrapper-was-not-found/" /><id>&lt;p&gt;Bootstrapper errors are not very common during development in Optimizely CMS but they do occur on special occasions.&lt;/p&gt;</id><updated>2023-01-20T15:13:32.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Validate Optimizely XhtmlString property length</title><link href="https://www.herlitz.io/2022/12/21/validate-optimizely-xhtmlstring-property-length/" /><id>&lt;p&gt;Since the built in attributes [StringLength], [MinLength] and [MaxLength] doesn&#39;t work when using a XhtmlString property we need to implement a custom ValidationAttribute.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id=&quot;gtx-trans&quot; style=&quot;position: absolute; left: 425px; top: -28px;&quot;&gt;

&lt;/div&gt;</id><updated>2022-12-21T15:16:01.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Creating a new CMS database using the Optimizely CLI</title><link href="http://www.herlitz.nu/2022/06/30/creating-a-new-cms-database-using-the-optimizely-cli/" /><id>&lt;p&gt;CLI tools are getting more and more popular once again. In this short blog post, I&#39;ll guide you on how to set up a new Optimizely CMS database and add an admin user to the database.&lt;/p&gt;</id><updated>2022-06-30T17:29:11.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Creating a new CMS database using the Optimizely CLI</title><link href="https://www.herlitz.io/2022/06/30/creating-a-new-cms-database-using-the-optimizely-cli/" /><id>&lt;p&gt;CLI tools are getting more and more popular once again. In this short blog post, I&#39;ll guide you on how to set up a new Optimizely CMS database and add an admin user to the database.&lt;/p&gt;</id><updated>2022-06-30T17:29:11.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Creating page types in Optimizely CMS 12 using the command line</title><link href="http://www.herlitz.nu/2022/05/12/creating-page-types-in-optimizely-cms-12-using-the-command-line/" /><id>&lt;p&gt;Creating page types and similar using the Optimizely CLI may be a new approach to many but when you get the basics it is very powerful. Here are some advices on how to script and setup content types and controllers a bit more automated.&lt;/p&gt;</id><updated>2022-05-12T13:32:10.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Creating page types in Optimizely CMS 12 using the command line</title><link href="https://www.herlitz.io/2022/05/12/creating-page-types-in-optimizely-cms-12-using-the-command-line/" /><id>&lt;p&gt;Creating page types and similar using the Optimizely CLI may be a new approach to many but when you get the basics it is very powerful. Here are some advices on how to script and setup content types and controllers a bit more automated.&lt;/p&gt;</id><updated>2022-05-12T13:32:10.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Programmatically rewriting all  site and host definitions to HTTPS in Optimizely CMS</title><link href="http://www.herlitz.nu/2022/05/05/programmatically-rewriting-all--site-and-host-definitions-to-https-in-optimizely-cms/" /><id>&lt;p&gt;Some sites have many host definitions, and some want&#39;s to enforce HTTPS within Optimizely CMS.&lt;/p&gt;</id><updated>2022-05-05T13:31:26.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Programmatically rewriting all  site and host definitions to HTTPS in Optimizely CMS</title><link href="https://www.herlitz.io/2022/05/05/programmatically-rewriting-all--site-and-host-definitions-to-https-in-optimizely-cms/" /><id>&lt;p&gt;Some sites have many host definitions, and some want&#39;s to enforce HTTPS within Optimizely CMS.&lt;/p&gt;</id><updated>2022-05-05T13:31:26.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Optimizely CMS 12 CLI tools, getting started</title><link href="http://www.herlitz.nu/2022/05/03/optimizely-cms-12-cli-tools-getting-started/" /><id>&lt;p&gt;Since the launch of CMS 12, the usage of CLI tools (command-line interfaces) has accelerated. This is mostly awesome since it is costly and not very platform multi-platform to build graphical user interfaces. CLI tools are also simpler to ship and install and usually more powerful.&lt;/p&gt;</id><updated>2022-05-03T09:03:08.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Optimizely CMS 12 CLI tools, getting started</title><link href="https://www.herlitz.io/2022/05/03/optimizely-cms-12-cli-tools-getting-started/" /><id>&lt;p&gt;Since the launch of CMS 12, the usage of CLI tools (command-line interfaces) has accelerated. This is mostly awesome since it is costly and not very platform multi-platform to build graphical user interfaces. CLI tools are also simpler to ship and install and usually more powerful.&lt;/p&gt;</id><updated>2022-05-03T09:03:08.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Running Optimizely CMS behind NGINX Reverse Proxy</title><link href="http://www.herlitz.nu/2022/03/27/running-optimizely-cms-behind-nginx-reverse-proxy/" /><id>&lt;p&gt;A reverse proxy is a server that acts as a single point of entry to as many services (e.g. web sites) as you like on your internal network. The reverse proxy typically sits behind the firewall and directs requests to the appropriate backend server. The firewall is configured to allow certain traffic to be transmitted from and to the reverse proxy. Reverse proxies are typically implemented to scale different types of services, increase security, performance, and reliability.&lt;/p&gt;</id><updated>2022-03-27T19:27:44.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Running Optimizely CMS behind NGINX Reverse Proxy</title><link href="https://www.herlitz.io/2022/03/27/running-optimizely-cms-behind-nginx-reverse-proxy/" /><id>&lt;p&gt;A reverse proxy is a server that acts as a single point of entry to as many services (e.g. web sites) as you like on your internal network. The reverse proxy typically sits behind the firewall and directs requests to the appropriate backend server. The firewall is configured to allow certain traffic to be transmitted from and to the reverse proxy. Reverse proxies are typically implemented to scale different types of services, increase security, performance, and reliability.&lt;/p&gt;</id><updated>2022-03-27T19:27:44.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Setting a static license path in Optimizely CMS 12</title><link href="http://www.herlitz.nu/2022/03/03/setting-static-license-path-in-optimizely-cms-12/" /><id>&lt;p&gt;There is an alternative to having license files in the project root directory where you instead set a path to where you store your license files. This is an excellent way to also remove the need of extra deployments to update the license file.&lt;/p&gt;</id><updated>2022-03-03T13:10:45.0000000Z</updated><summary type="html">Blog post</summary></entry> <entry><title>Setting a static license path in Optimizely CMS 12</title><link href="https://www.herlitz.io/2022/03/03/setting-static-license-path-in-optimizely-cms-12/" /><id>&lt;p&gt;There is an alternative to having license files in the project root directory where you instead set a path to where you store your license files. This is an excellent way to also remove the need of extra deployments to update the license file.&lt;/p&gt;</id><updated>2022-03-03T13:10:45.0000000Z</updated><summary type="html">Blog post</summary></entry></feed>