HomeDev GuideAPI Reference
Dev GuideAPI ReferenceUser GuideGitHubNuGetDev CommunityDoc feedbackLog In
GitHubNuGetDev CommunityDoc feedback

Content Delivery API and Azure AD

Describes how to customize Optimizely Content Delivery API (version 2) with an external login system like Azure AD.



This section applies only if you are still using Content Delivery Api v2.x.x. For users using Content Delivery API v3.x.x, see API Authentication instead.

First, set up a site using Optimizely Azure AD. See Integrate Azure AD using OpenID Connect in the Optimizely Content Management System (CMS) developer guide.

Normally, the user information is synchronized with the website by calling ServiceLocator.Current.GetInstance<ISynchronizingUserService>.SynchronizeAsync(ctx.AuthenticationTicket.Identity) when using external login systems. You need to customize the initialization process for Content Delivery API to retrieve the roles synced from Azure AD.

  • Create the class CustomInitializationService which inherits InitializationService. Override GetAllRoles().
public class CustomInitializationService : InitializationService
  /// <summary>
  /// Get all roles from system.
  /// </summary>
protected override IEnumerable<string> GetAllRoles()
    var synUserRepo = ServiceLocator.Current.GetInstance<ISynchronizedUsersRepository>();
    var rolesStatus = synUserRepo.ListRoleStatus();
    return (rolesStatus != null && rolesStatus.Any()) ? rolesStatus.Select(x => x.Name) : null;
  • Register the class at the initialization module.
public class DependencyResolverInitialization : IConfigurableModule
    public void ConfigureContainer(ServiceConfigurationContext context)
        //Implementations for custom interfaces can be registered here.
        context.ConfigurationComplete += (o, e) =>
            //Register custom implementations that should be used in favour of the default implementations
            context.Services.AddTransient<IContentRenderer, ErrorHandlingContentRenderer>()
            .AddTransient<ContentAreaRenderer, AlloyContentAreaRenderer>()            
            .AddTransient<InitializationService, CustomInitializationService>();
    public void Initialize(InitializationEngine context)
        DependencyResolver.SetResolver(new ServiceLocatorDependencyResolver(context.Locate.Advanced));
    public void Uninitialize(InitializationEngine context)
    public void Preload(string[] parameters)

The code examples here give you the simplest code customizations. For more complicated scenarios, you can customize the class accordingly.