using Microsoft.AspNetCore.Mvc.ApplicationModels; using Microsoft.AspNetCore.Mvc.ModelBinding; using System.Collections.Generic; using System.Linq; using Umbraco.Web.Common.Attributes; namespace Umbraco.Web.Common.ApplicationModels { // TODO: This should just exist in the back office project /// /// An application model provider for all Umbraco Back Office controllers /// public class BackOfficeApplicationModelProvider : IApplicationModelProvider { public BackOfficeApplicationModelProvider(IModelMetadataProvider modelMetadataProvider) { ActionModelConventions = new List() { new BackOfficeIdentityCultureConvention(), new AuthenticateAsBackOfficeSchemeConvention() }; } /// /// Will execute after /// public int Order => 0; public List ActionModelConventions { get; } public void OnProvidersExecuted(ApplicationModelProviderContext context) { } public void OnProvidersExecuting(ApplicationModelProviderContext context) { foreach (var controller in context.Result.Controllers) { if (!IsBackOfficeController(controller)) continue; foreach (var action in controller.Actions) { foreach (var convention in ActionModelConventions) { convention.Apply(action); } } } } private bool IsBackOfficeController(ControllerModel controller) => controller.Attributes.OfType().Any(); } }