protected virtual SPAppPrincipal FindExistingAppPrincipal(WebModelHost webHost,
            AppPrincipalDefinition appPrincipalModel)
        {
            var appPrincipalManager = SPAppPrincipalManager.GetManager(webHost.HostWeb);
            var appPrincipalProvider = SPAppPrincipalIdentityProvider.External;

            var appPrincipalName = SPAppPrincipalName.CreateFromAppPrincipalIdentifier(appPrincipalModel.AppId);
            return appPrincipalManager.LookupAppPrincipal(appPrincipalProvider, appPrincipalName);
        }
        protected virtual AppPrincipal FindExistingAppPrincipal(WebModelHost webHost, AppPrincipalDefinition appPrincipalModel)
        {
            var context = webHost.HostWeb.Context;
            //var context = webHost.HostclientContext;

            var appPrincipalManager = AppPrincipalManager.GetManager(context, webHost.HostWeb);
            var appPrincipalProvider = AppPrincipalIdentityProvider.GetExternal(context);

            var appPrincipalName = AppPrincipalName.CreateFromAppPrincipalIdentifier(context, appPrincipalModel.AppId);
            var result = appPrincipalManager.LookupAppPrincipal(appPrincipalProvider, appPrincipalName);

            context.Load(result);
            context.ExecuteQueryWithTrace();

            return result;
        }
        private void DeployAppPrincipal(object modelHost, WebModelHost webHost, AppPrincipalDefinition appPrincipalModel)
        {
            var context = webHost.HostWeb.Context;

            var appPrincipalManager = AppPrincipalManager.GetManager(context, webHost.HostWeb);
            var principal = FindExistingAppPrincipal(webHost, appPrincipalModel);

            context.ExecuteQueryWithTrace();

            InvokeOnModelEvent(this, new ModelEventArgs
            {
                CurrentModelNode = null,
                Model = null,
                EventType = ModelEventType.OnProvisioning,
                Object = principal,
                ObjectType = typeof(AppPrincipal),
                ObjectDefinition = appPrincipalModel,
                ModelHost = modelHost
            });


            if (principal == null)
            {
                var endpoints = new List<string>();
                endpoints.Add(appPrincipalModel.RedirectURI);

                var now = DateTime.Now;

                var credential = AppPrincipalCredential.CreateFromSymmetricKey(context, appPrincipalModel.AppSecret, now, now.AddYears(1));

                var externalAppPrincipalCreationParameters = new ExternalAppPrincipalCreationParameters()
                {
                    AppIdentifier = appPrincipalModel.AppId,
                    DisplayName = appPrincipalModel.Title,
                    Credential = credential,
                    ApplicationEndpointAuthorities = endpoints
                };

                principal = appPrincipalManager.CreateAppPrincipal(externalAppPrincipalCreationParameters);

                InvokeOnModelEvent(this, new ModelEventArgs
                {
                    CurrentModelNode = null,
                    Model = null,
                    EventType = ModelEventType.OnProvisioned,
                    Object = principal,
                    ObjectType = typeof(AppPrincipal),
                    ObjectDefinition = appPrincipalModel,
                    ModelHost = modelHost
                });
            }
            else
            {
                InvokeOnModelEvent(this, new ModelEventArgs
                {
                    CurrentModelNode = null,
                    Model = null,
                    EventType = ModelEventType.OnProvisioned,
                    Object = principal,
                    ObjectType = typeof(AppPrincipal),
                    ObjectDefinition = appPrincipalModel,
                    ModelHost = modelHost
                });
            }
        }
 public static ModelNode AddAppPrincipal(this ModelNode model, AppPrincipalDefinition definition, Action<ModelNode> action)
 {
     return model.AddDefinitionNode(definition, action);
 }
 public static ModelNode AddAppPrincipal(this ModelNode model, AppPrincipalDefinition definition)
 {
     return AddAppPrincipal(model, definition, null);
 }
        private void DeployAppPrincipal(object modelHost, WebModelHost webHost, AppPrincipalDefinition appPrincipalModel)
        {
            var appPrincipalManager = SPAppPrincipalManager.GetManager(webHost.HostWeb);
            var principal = FindExistingAppPrincipal(webHost, appPrincipalModel);

            InvokeOnModelEvent(this, new ModelEventArgs
            {
                CurrentModelNode = null,
                Model = null,
                EventType = ModelEventType.OnProvisioning,
                Object = principal,
                ObjectType = typeof(SPAppPrincipal),
                ObjectDefinition = appPrincipalModel,
                ModelHost = modelHost
            });

            if (principal == null)
            {
                TraceService.Information((int)LogEventId.ModelProvisionProcessingNewObject, "Processing app principal");

                var endpoints = new List<string>();
                endpoints.Add(appPrincipalModel.RedirectURI);

                var secureString = new SecureString();

                for (int i = 0; i < appPrincipalModel.AppSecret.Length; i++)
                {
                    char c = appPrincipalModel.AppSecret[i];
                    secureString.AppendChar(c);
                }
                secureString.MakeReadOnly();

                var now = DateTime.Now;

                var credential = SPAppPrincipalCredential.CreateFromSymmetricKey(secureString, now, now.AddYears(1));

                var externalAppPrincipalCreationParameters = new SPExternalAppPrincipalCreationParameters(appPrincipalModel.AppId, appPrincipalModel.Title, endpoints, credential)
                {
                    SkipExternalDirectoryRegistration = false
                };

                principal = appPrincipalManager.CreateAppPrincipal(externalAppPrincipalCreationParameters);

                InvokeOnModelEvent(this, new ModelEventArgs
                {
                    CurrentModelNode = null,
                    Model = null,
                    EventType = ModelEventType.OnProvisioned,
                    Object = principal,
                    ObjectType = typeof(SPAppPrincipal),
                    ObjectDefinition = appPrincipalModel,
                    ModelHost = modelHost
                });
            }
            else
            {
                TraceService.Information((int)LogEventId.ModelProvisionProcessingExistingObject, "Processing existing app principal");

                InvokeOnModelEvent(this, new ModelEventArgs
                {
                    CurrentModelNode = null,
                    Model = null,
                    EventType = ModelEventType.OnProvisioned,
                    Object = principal,
                    ObjectType = typeof(SPAppPrincipal),
                    ObjectDefinition = appPrincipalModel,
                    ModelHost = modelHost
                });
            }
        }