Beispiel #1
0
        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));
        }
        /// <summary>
        /// Enables trust for the workflow app on the web
        /// </summary>
        /// <param name="web">SPWeb to enable trust on</param>
        /// <param name="permissionKind">Kind of trust to grant</param>
        /// <returns>True if the permission is granted successfully</returns>
        public static bool TrustWorkflowApp(SPWeb web, SPAppPrincipalPermissionKind permissionKind)
        {
            bool permissionGranted = false;

            if (web != null)
            {
                var appPrincipals = web.GetSiteAppPrincipals();

                SPAppPrincipalManager            manager = SPAppPrincipalManager.GetManager(web);
                SPAppPrincipalPermissionsManager perm    = new SPAppPrincipalPermissionsManager(web);
                Assembly        assembly        = Assembly.Load("Microsoft.SharePoint.WorkflowServices.Intl, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c");
                ResourceManager resourceManager = new ResourceManager("Microsoft.SharePoint.WorkflowServices.Strings", assembly);
                string          workflowAppName = resourceManager.GetString("ApplicationDisplayName", web.Locale);

                foreach (SPSiteAppPrincipalInfo info in appPrincipals)
                {
                    if (info.DisplayName.ToLower().Equals(workflowAppName.ToLower()))
                    {
                        string appPrincipalIdentifier = GetAppIdentifier(info.EncodedIdentityClaim);

                        SPAppPrincipalName       name = SPAppPrincipalName.CreateFromAppPrincipalIdentifier(appPrincipalIdentifier);
                        SPAppPrincipal           p    = manager.LookupAppPrincipal(SPAppPrincipalIdentityProvider.External, name);
                        object                   urls = GetInstanceField(typeof(SPAppPrincipal), p, "RedirectAddresses");
                        ReadOnlyCollection <Uri> uris = urls as ReadOnlyCollection <Uri>;

                        // Trust the workflow app scoped that this web only
                        if (uris != null && uris.FirstOrDefault(u => u.AbsoluteUri.ToLower().Equals(web.Url.ToLower())) != null)
                        {
                            perm.AddAppPrincipalToSite(p, SPAppPrincipalPermissionKind.FullControl);
                        }

                        permissionGranted = true;
                    }
                }
            }

            return(permissionGranted);
        }
Beispiel #3
0
        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
                });
            }
        }