private static void ConnectOAuth(this ConnectionDetail connectionDetail) { if (!string.IsNullOrEmpty(connectionDetail.RefreshToken)) { CrmServiceClient.AuthOverrideHook = new RefreshTokenAuthOverride(connectionDetail); crmSvc = new CrmServiceClient(new Uri($"https://{connectionDetail.ServerName}:{connectionDetail.ServerPort}"), true); CrmServiceClient.AuthOverrideHook = null; } else { var secret = CryptoManager.Decrypt(connectionDetail.GetClientSecret(), ConnectionManager.CryptoPassPhrase, ConnectionManager.CryptoSaltValue, ConnectionManager.CryptoHashAlgorythm, ConnectionManager.CryptoPasswordIterations, ConnectionManager.CryptoInitVector, ConnectionManager.CryptoKeySize); var path = Path.Combine(Path.GetTempPath(), connectionDetail.ConnectionId.Value.ToString("B"), "oauth-cache.txt"); crmSvc = new CrmServiceClient(new Uri($"https://{connectionDetail.ServerName}:{connectionDetail.ServerPort}"), connectionDetail.AzureAdAppId.ToString(), CrmServiceClient.MakeSecureString(secret), true, path); } }
/// <summary> /// Handles returning the url for Certificate, ClientSecret and OAuth with MFA /// </summary> public static string GetNonUserConnectionString(this ConnectionDetail detail) { switch (detail.NewAuthType) { case Microsoft.Xrm.Tooling.Connector.AuthenticationType.Certificate: return($"AuthType=Certificate;Url={detail.GetUrlString()};ThumbPrint={detail.Certificate.Thumbprint};ClientId={detail.AzureAdAppId};"); case Microsoft.Xrm.Tooling.Connector.AuthenticationType.ClientSecret: return($"AuthType=ClientSecret;Url={detail.GetUrlString()};ClientId={detail.AzureAdAppId};ClientSecret={detail.GetClientSecret()};"); case Microsoft.Xrm.Tooling.Connector.AuthenticationType.OAuth: if (detail.UseMfa) { var path = Path.Combine(Path.GetTempPath(), detail.ConnectionId.Value.ToString("B")); return($"AuthType=OAuth;Username={detail.UserName};Url={detail.GetUrlString()};AppId={detail.AzureAdAppId};RedirectUri={detail.ReplyUrl};TokenCacheStorePath={path};LoginPrompt=Auto"); } break; } return(null); }
public static CrmServiceClient GetCrmServiceClient(this ConnectionDetail connectionDetail, bool forceNewService = false) { if (forceNewService == false && crmSvc != null) { connectionDetail.SetImpersonationCapability(); return(crmSvc); } if (connectionDetail.Timeout.Ticks == 0) { connectionDetail.Timeout = new TimeSpan(0, 2, 0); } CrmServiceClient.MaxConnectionTimeout = connectionDetail.Timeout; if (connectionDetail.Certificate != null) { var cs = HandleConnectionString(connectionDetail, $"AuthType=Certificate;url={connectionDetail.OriginalUrl};thumbprint={connectionDetail.Certificate.Thumbprint};ClientId={connectionDetail.AzureAdAppId};RequireNewInstance={forceNewService}"); crmSvc = new CrmServiceClient(cs); } else if (!string.IsNullOrEmpty(connectionDetail.ConnectionString)) { var cs = HandleConnectionString(connectionDetail, connectionDetail.ConnectionString); crmSvc = new CrmServiceClient(cs); } else if (connectionDetail.NewAuthType == (CrmWebResourcesUpdater.DataModels.AuthenticationType)(int) AuthenticationType.ClientSecret) { var cs = HandleConnectionString(connectionDetail, $"AuthType=ClientSecret;url={connectionDetail.OriginalUrl};ClientId={connectionDetail.AzureAdAppId};ClientSecret={connectionDetail.GetClientSecret()};RequireNewInstance={forceNewService}"); crmSvc = new CrmServiceClient(cs); } else if (connectionDetail.NewAuthType == (CrmWebResourcesUpdater.DataModels.AuthenticationType)(int) AuthenticationType.OAuth&& connectionDetail.UseMfa) { var path = Path.Combine(Path.GetTempPath(), connectionDetail.ConnectionId.Value.ToString("B")); var cs = HandleConnectionString(connectionDetail, $"AuthType=OAuth;Username={connectionDetail.UserName};Url={connectionDetail.OriginalUrl};AppId={connectionDetail.AzureAdAppId};RedirectUri={connectionDetail.ReplyUrl};TokenCacheStorePath={path};LoginPrompt=Auto;RequireNewInstance={forceNewService}"); crmSvc = new CrmServiceClient(cs); } else if (!string.IsNullOrEmpty(connectionDetail.GetClientSecret())) { ConnectOAuth(connectionDetail); } else if (connectionDetail.UseOnline) { ConnectOnline(connectionDetail); } else if (connectionDetail.UseIfd) { ConnectIfd(connectionDetail); } else { ConnectOnprem(connectionDetail); } if (!crmSvc.IsReady) { var error = crmSvc.LastCrmError; crmSvc = null; throw new Exception(error); } connectionDetail.SetImpersonationCapability(); connectionDetail.OrganizationFriendlyName = crmSvc.ConnectedOrgFriendlyName; connectionDetail.OrganizationDataServiceUrl = crmSvc.ConnectedOrgPublishedEndpoints[EndpointType.OrganizationDataService]; connectionDetail.OrganizationServiceUrl = crmSvc.ConnectedOrgPublishedEndpoints[EndpointType.OrganizationService]; connectionDetail.WebApplicationUrl = crmSvc.ConnectedOrgPublishedEndpoints[EndpointType.WebApplication]; connectionDetail.Organization = crmSvc.ConnectedOrgUniqueName; connectionDetail.OrganizationVersion = crmSvc.ConnectedOrgVersion.ToString(); connectionDetail.TenantId = crmSvc.TenantId; connectionDetail.EnvironmentId = crmSvc.EnvironmentId; var webAppURi = new Uri(connectionDetail.WebApplicationUrl); connectionDetail.ServerName = webAppURi.Host; connectionDetail.ServerPort = webAppURi.Port; //UseIfd = crmSvc.ActiveAuthenticationType == AuthenticationType.IFD; switch (crmSvc.ActiveAuthenticationType) { case AuthenticationType.AD: case AuthenticationType.Claims: connectionDetail.AuthType = (CrmWebResourcesUpdater.DataModels.AuthenticationProviderType)(int) AuthenticationProviderType.ActiveDirectory; break; case AuthenticationType.IFD: connectionDetail.AuthType = (CrmWebResourcesUpdater.DataModels.AuthenticationProviderType)(int) AuthenticationProviderType.Federation; break; case AuthenticationType.Live: connectionDetail.AuthType = (CrmWebResourcesUpdater.DataModels.AuthenticationProviderType)(int) AuthenticationProviderType.LiveId; break; case AuthenticationType.OAuth: // TODO add new property in ConnectionDetail class? break; case AuthenticationType.Office365: connectionDetail.AuthType = (CrmWebResourcesUpdater.DataModels.AuthenticationProviderType)(int) AuthenticationProviderType.OnlineFederation; break; } return(crmSvc); }