<?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="https://world.optimizely.com/blogs/Eric-Herlitz/" /><updated>2025-11-12T09:31:15.0000000Z</updated><id>https://world.optimizely.com/blogs/Eric-Herlitz/</id><generator uri="https://world.optimizely.com/blogs/Eric-Herlitz/" 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>https://www.herlitz.io/2025/11/12/handling-multiple-openid-connect-providers-in-optimizely-cms-with-.net-8/</id><published>2025-11-12T08:35:15.0000000Z</published><updated>2025-11-12T09:31:15.0000000Z</updated><author><name>eric@herlitz.nu</name></author><category term="Blog post" /><summary type="html">&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="243" data-end="262"&gt;IdentityServer&lt;/strong&gt;&amp;nbsp;for the public site and &lt;strong data-start="287" data-end="309"&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;</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>https://www.herlitz.io/2025/10/20/speeding-up-local-development-with-a-fake-openid-authentication-handler/</id><published>2025-10-20T15:09:38.0000000Z</published><updated>2025-10-20T15:31:13.0000000Z</updated><author><name>eric@herlitz.nu</name></author><category term="Blog post" /><summary type="html">&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 "local authentication" module that mimics OpenID for development – no external dependencies required.&lt;/p&gt;</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>https://www.herlitz.io/2024/02/22/optimizely-cms-in-a-terminal-console-app/</id><published>2024-02-22T08:04:52.0000000Z</published><updated>2024-09-27T09:00:23.0000000Z</updated><author><name>eric@herlitz.nu</name></author><category term="Blog post" /><summary type="html">&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;</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>https://www.herlitz.io/2023/01/27/implementing-embeddedlocalization-in-optimizely-cms-12/</id><published>2023-01-27T12:25:19.0000000Z</published><updated>2023-01-27T15:00:25.0000000Z</updated><author><name>eric@herlitz.nu</name></author><category term="Blog post" /><summary type="html">&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="gtx-trans" style="position: absolute; left: 407px; top: 92.2px;"&gt;

&lt;/div&gt;</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>https://www.herlitz.io/2023/01/26/translating-optimizely-cms-12-ui-components/</id><published>2023-01-26T17:33:08.0000000Z</published><updated>2023-01-26T18:30:25.0000000Z</updated><author><name>eric@herlitz.nu</name></author><category term="Blog post" /><summary type="html">&lt;p&gt;Optimizely CMS 12 have been out for a while now, but still some elements haven'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;</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>https://www.herlitz.io/2023/01/25/setting-up-the-imageeditor-in-optimizely-cms-12/</id><published>2023-01-25T17:44:23.0000000Z</published><updated>2023-01-26T17:00:24.0000000Z</updated><author><name>eric@herlitz.nu</name></author><category term="Blog post" /><summary type="html">&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's a small guide on how to read and use the documentation from Optimizely regarding the ImageEditor.&lt;/p&gt;</summary></entry><entry><title>Resolving Optimizely CMS error "InvalidOperationException: The view 'Bootstrapper' was not found."</title><link href="https://www.herlitz.io/2023/01/20/resolving-optimizely-cms-error-invalidoperationexception-the-view-bootstrapper-was-not-found/" /><id>https://www.herlitz.io/2023/01/20/resolving-optimizely-cms-error-invalidoperationexception-the-view-bootstrapper-was-not-found/</id><published>2023-01-20T15:13:32.0000000Z</published><updated>2023-01-26T17:00:25.0000000Z</updated><author><name>eric@herlitz.nu</name></author><category term="Blog post" /><summary type="html">&lt;p&gt;Bootstrapper errors are not very common during development in Optimizely CMS but they do occur on special occasions.&lt;/p&gt;</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>https://www.herlitz.io/2022/12/21/validate-optimizely-xhtmlstring-property-length/</id><published>2022-12-21T15:16:01.0000000Z</published><updated>2023-01-26T17:00:25.0000000Z</updated><author><name>eric@herlitz.nu</name></author><category term="Blog post" /><summary type="html">&lt;p&gt;Since the built in attributes [StringLength], [MinLength] and [MaxLength] doesn'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="gtx-trans" style="position: absolute; left: 425px; top: -28px;"&gt;

&lt;/div&gt;</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>http://www.herlitz.nu/2022/06/30/creating-a-new-cms-database-using-the-optimizely-cli/</id><published>2022-06-30T17:29:11.0000000Z</published><updated>2022-06-30T18:30:27.0000000Z</updated><author><name>eric@herlitz.nu</name></author><category term="Blog post" /><summary type="html">&lt;p&gt;CLI tools are getting more and more popular once again. In this short blog post, I'll guide you on how to set up a new Optimizely CMS database and add an admin user to the database.&lt;/p&gt;</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>https://www.herlitz.io/2022/06/30/creating-a-new-cms-database-using-the-optimizely-cli/</id><published>2022-06-30T17:29:11.0000000Z</published><updated>2023-01-11T17:00:24.0000000Z</updated><author><name>eric@herlitz.nu</name></author><category term="Blog post" /><summary type="html">&lt;p&gt;CLI tools are getting more and more popular once again. In this short blog post, I'll guide you on how to set up a new Optimizely CMS database and add an admin user to the database.&lt;/p&gt;</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>http://www.herlitz.nu/2022/05/12/creating-page-types-in-optimizely-cms-12-using-the-command-line/</id><published>2022-05-12T13:32:10.0000000Z</published><updated>2022-05-12T14:00:44.0000000Z</updated><author><name>eric@herlitz.nu</name></author><category term="Blog post" /><summary type="html">&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;</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>https://www.herlitz.io/2022/05/12/creating-page-types-in-optimizely-cms-12-using-the-command-line/</id><published>2022-05-12T13:32:10.0000000Z</published><updated>2023-01-11T17:00:25.0000000Z</updated><author><name>eric@herlitz.nu</name></author><category term="Blog post" /><summary type="html">&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;</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>http://www.herlitz.nu/2022/05/05/programmatically-rewriting-all--site-and-host-definitions-to-https-in-optimizely-cms/</id><published>2022-05-05T13:31:26.0000000Z</published><updated>2022-05-05T14:01:07.0000000Z</updated><author><name>eric@herlitz.nu</name></author><category term="Blog post" /><summary type="html">&lt;p&gt;Some sites have many host definitions, and some want's to enforce HTTPS within Optimizely CMS.&lt;/p&gt;</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>https://www.herlitz.io/2022/05/05/programmatically-rewriting-all--site-and-host-definitions-to-https-in-optimizely-cms/</id><published>2022-05-05T13:31:26.0000000Z</published><updated>2022-05-10T08:30:22.0000000Z</updated><author><name>eric@herlitz.nu</name></author><category term="Blog post" /><summary type="html">&lt;p&gt;Some sites have many host definitions, and some want's to enforce HTTPS within Optimizely CMS.&lt;/p&gt;</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>http://www.herlitz.nu/2022/05/03/optimizely-cms-12-cli-tools-getting-started/</id><published>2022-05-03T09:03:08.0000000Z</published><updated>2022-05-03T11:00:26.0000000Z</updated><author><name>eric@herlitz.nu</name></author><category term="Blog post" /><summary type="html">&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;</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>https://www.herlitz.io/2022/05/03/optimizely-cms-12-cli-tools-getting-started/</id><published>2022-05-03T09:03:08.0000000Z</published><updated>2022-05-10T08:30:22.0000000Z</updated><author><name>eric@herlitz.nu</name></author><category term="Blog post" /><summary type="html">&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;</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>http://www.herlitz.nu/2022/03/27/running-optimizely-cms-behind-nginx-reverse-proxy/</id><published>2022-03-27T19:27:44.0000000Z</published><updated>2022-04-01T17:00:20.0000000Z</updated><author><name>eric@herlitz.nu</name></author><category term="Blog post" /><summary type="html">&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;</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>https://www.herlitz.io/2022/03/27/running-optimizely-cms-behind-nginx-reverse-proxy/</id><published>2022-03-27T19:27:44.0000000Z</published><updated>2022-05-10T08:30:22.0000000Z</updated><author><name>eric@herlitz.nu</name></author><category term="Blog post" /><summary type="html">&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;</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>http://www.herlitz.nu/2022/03/03/setting-static-license-path-in-optimizely-cms-12/</id><published>2022-03-03T13:10:45.0000000Z</published><updated>2022-03-03T19:00:23.0000000Z</updated><author><name>eric@herlitz.nu</name></author><category term="Blog post" /><summary type="html">&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;</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>https://www.herlitz.io/2022/03/03/setting-static-license-path-in-optimizely-cms-12/</id><published>2022-03-03T13:10:45.0000000Z</published><updated>2022-05-10T08:30:23.0000000Z</updated><author><name>eric@herlitz.nu</name></author><category term="Blog post" /><summary type="html">&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;</summary></entry></feed>