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); }
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 }); } }