HomeGuidesAPI Reference
Submit Documentation FeedbackJoin Developer CommunityOptimizely GitHubOptimizely NuGetLog In

Content Delivery API and Azure AD

This topic describes how to customize ContentDeliveryApi with an external login system like Azure AD.

First, set up a site using Optimizely Azure AD. See Integrate Azure AD using OpenID Connect in the Optimizely 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().
[ServiceConfiguration(typeof(InitializationService))]
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.
[InitializableModule]
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.


Did this page help you?