Loading...
Area: Episerver Content Delivery API
Applies to versions: 2.9.0 and higher
Other versions:

Content Delivery API and Azure AD

Recommended reading 

This topic gives you an example of how to customize ContentDeliveryApi with an external login system like AzureAD.

First, set up a site using Episerver Azure AD. See Integrate Azure AD using OpenID Connect in the Episerver 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 will need to customize the initialization process so Content Delivery Api can retrieve all 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.

Do you find this information helpful? Please log in to provide feedback.

Last updated: Jul 01, 2019

Recommended reading