Esempio n. 1
0
        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);
            }
        }
Esempio n. 2
0
        /// <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);
        }
Esempio n. 3
0
        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);
        }