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.
Last updated: Jul 01, 2019