Я работал над проектом в течение последних 5 месяцев - интегрировал одну из наших старых систем для использования Dynamics365 CRM для хранения и записи потенциальных клиентов для нашего отдела маркетинга и продаж.
В нескольких средах все работает как надо - у нас есть DEV, Sandbox, а также TEST и мой локальный компьютер.Он работает везде, кроме сервера UAT, который находится в совершенно другом городе, в отличие от других, находящихся в здании, в котором мы работаем.
Мы убедились, что используется TSL 1.2, и приложение вызывает это в коде.По сравнению с функциями .NET на всех машинах они одинаковы, шифры и файлы конфигурации практически одинаковы, различия незначительны, например, строки подключения для наших баз данных.
Мы подключаемся к одному и тому же экземпляру CRM во всех средах.
Проект был скомпилирован с использованием .NET 4.6.1
Microsoft.CrmSdk.CoreAssemblies - 9.0.2.4
Microsoft.CrmSdk.XrmTooling.CoreAssembly - 9.0.2.7
Microsoft.IdentityModel.Clients.ActiveDirectory - 2.22.302111727
Наш Azure (мы используем AD для входа в CRM через C #) не имеет белого списка.
Насколько нам известно, динамика не имеет белого списка.
Нет правила брандмауэра, которое блокирует любые исходящие соединения через порт 443, поэтому все напоминает другие среды, но мы получаем " Невозможно войтиto Dynamics CRM"сообщение об ошибке.
Это код, который мы используем для подключения к CRM ..
string Thumbprint = ConfigurationManager.AppSettings["CertThumbprint"];
string adInstance = ConfigurationManager.AppSettings["ADInstance"];
string adTenant = ConfigurationManager.AppSettings["Tenant"];
string Url = ConfigurationManager.AppSettings["Application"];
string AppId = ConfigurationManager.AppSettings["ClientId"];
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
X509Store certStore = new X509Store(StoreName.My, StoreLocation.LocalMachine);
certStore.Open(OpenFlags.ReadOnly);
X509Certificate2Collection CertificateCollection = certStore.Certificates.Find(X509FindType.FindByThumbprint, Thumbprint, false);
if (CertificateCollection.Count == 0)
throw new Exception("Error: Could not find the right certificate.");
X509Certificate2 AzureCertificate = CertificateCollection[0];
CrmServiceClient.AuthOverrideHook = new AuthHook(adInstance, adTenant, Url, AppId, AzureCertificate);
var crmSvc = new CrmServiceClient(new Uri(Url), true);
if (crmSvc == null || !crmSvc.IsReady) throw new Exception(crmSvc == null ? "CrmServiceClient Failure." : crmSvc.LastCrmException.ToString());
this.service = (IOrganizationService)crmSvc.OrganizationWebProxyClient ?? crmSvc.OrganizationServiceProxy;
Эта строка специально возвращает ошибку и также имеет значение null...
var crmSvc = new CrmServiceClient(new Uri(Url), true);
Стоит отметить, что единственная разница между UAT по сравнению с остальными заключается в том, что UAT работает на .NET 4.7.1 по сравнению с другими, на которых работает .NET 4.7.2.
Если кто-нибудь сталкивался с этим, он был бы очень признателен или поделился идеями, что это может быть.помогло.Та же ошибка ... этот метод работал в любой другой среде.
Используемый код:
ClientCredentials clientCredentials = new ClientCredentials();
if (!string.IsNullOrEmpty(ConfigurationManager.AppSettings["crm_user"]) &&
!string.IsNullOrEmpty(ConfigurationManager.AppSettings["crm_password"]))
{
clientCredentials.UserName.UserName = ConfigurationManager.AppSettings["crm_user"];
clientCredentials.UserName.Password = ConfigurationManager.AppSettings["crm_password"];
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
this.service = (IOrganizationService)new OrganizationServiceProxy(new Uri(ConfigurationManager.AppSettings["crm_org_url"]),
null, clientCredentials, null);
if (this.service == null)
{
Exception e = new Exception("CRM: Could not login to organization service proxy.");
throw e;
}
}
else
{
throw new Exception("CRM: Could not connect using a fallback method. The web configuration doesn't contain crm_user or crm_password keys.");
}