#dynamics-crm #microsoft-dynamics
#dynamics-crm #microsoft-dynamics
Вопрос:
У меня есть некоторый код интеграции, который предназначен для использования службы организации через CRM SDK.
В одной среде создание IServiceManagement<IOrganizationService>
:
IServiceManagement<IOrganizationService> orgServiceManagement = ServiceConfigurationFactory.CreateManagement<IOrganizationService>(new Uri("dynamics uri")));
а затем аутентификация с использованием учетных данных учетной записи службы:
AuthenticationCredentials authCredentials = new AuthenticationCredentials();
authCredentials.ClientCredentials.UserName.UserName = _config.GetValue<string>("Dynamics:Username");
authCredentials.ClientCredentials.UserName.Password = _config.GetValue<string>("Dynamics:Password");
AuthenticationCredentials tokenCredentials = orgServiceManagement.Authenticate(authCredentials);
работает нормально.
В другой среде Dynamics вызов GetServiceManagement завершается ошибкой со следующим сообщением об ошибке:
Система.Исключение InvalidOperationException HResult=0x80131509 Message=Метаданные содержат ссылку, которая не может быть разрешена: ‘https://login.microsoftonline.com /[guid]/oauth2/авторизовать?client_id=[некоторый идентификатор клиента]amp;response_mode=form_postamp;response_type=code id_tokenamp;scope=OpenID profileamp;state =OpenIdConnect.AuthenticationProperties%[some base-64] Перенаправляется на=https%3a%2f%2ftst-success.crm4.dynamics.com%2famp;nonce=[some nonce]amp;redirect_uri=https://cloudredirector.crm4.dynamics.com/G/AuthRedirect/Index.aspxamp;max_age=86400′. Источник = Система.Отслеживание стека ServiceModel: в системе.ServiceModel.Описание.MetadataExchangeClient.MetadataRetriever.Извлекать (TimeoutHelper timeoutHelper) в системе.ServiceModel.Описание.MetadataExchangeClient.ResolveNext(ResolveCallState разрешающий вызов) в системе.ServiceModel.Описание.MetadataExchangeClient.Получите METADATA (MetadataRetriever retriever) в системе.ServiceModel.Описание.MetadataExchangeClient.Получите METADATA (Uri-адрес, MetadataExchangeClientMode mode) в Microsoft.Xrm.Sdk.Client.ServiceMetadataUtility.Извлекает serviceendpointmetadata (тип contractType, Uri serviceUri, логическое значение checkForSecondary) в Microsoft.Xrm.Sdk.Client.ServiceConfiguration`1..ctor(Uri serviceUri, Boolean checkForSecondary) в Microsoft.Xrm.Sdk.Client.ServiceConfigurationFactory.Создайте конфигурацию [TService] (Uri serviceUri, логические разрешенияproxytypes, Assembly assembly) в Microsoft.Xrm.Sdk.Client.ServiceConfigurationFactory.Создайте конфигурацию [TService](Uri serviceUri) в CrmAuthTest.Program.Main(строка[] аргументов) в c:userst.wolversonSourceReposCrmAuthTestCrmAuthTestProgram.cs:line 18
Внутреннее исключение 1: XmlException: элементы CData недопустимы на верхнем уровне XML-документа. Строка 1, позиция 3.
(Я замаскировал биты, которые выглядят идентифицирующими или криптографическими)
При отправке по этому URL в PostMan отображается HTML для страницы входа в браузер, что объясняет сбой; это не то, что ожидает ServiceConfigurationFactory. Сценарий не является интерактивным для пользователя, поэтому это никогда не имело бы смысла, нет браузера и нет пользователя, способного взаимодействовать с ним.
Что мне нужно изменить в Dynamics CRM Online, чтобы это прекратилось и она просто работала нормально?
Комментарии:
1. пожалуйста, дайте мне знать, был ли мой ответ полезным или я могу помочь вам в дальнейшем.
Ответ №1:
Создаете ли вы экземпляр вашего OrganizationServiceProxy в зависимости от AuthenticationProviderType сразу после опубликованных строк кода? Вот так
var orgServiceManagement = ServiceConfigurationFactory.CreateManagement<IOrganizationService>(new Uri(ConfigurationManager.AppSettings["CrmUrlService"]));
var authCredentials = new AuthenticationCredentials();
authCredentials.ClientCredentials.UserName.UserName = ConfigurationManager.AppSettings["CrmUserName"];
authCredentials.ClientCredentials.UserName.Password = ConfigurationManager.AppSettings["CrmPassword"];
var tokenCredentials = orgServiceManagement.Authenticate(authCredentials);
IOrganizationService _service;
switch (orgServiceManagement.AuthenticationType)
{
case AuthenticationProviderType.ActiveDirectory:
_service = new OrganizationServiceProxy(orgServiceManagement, tokenCredentials.ClientCredentials);
break;
default:
_service = new OrganizationServiceProxy(orgServiceManagement, tokenCredentials.SecurityTokenResponse);
break;
}
Даже если это решит вашу проблему, я рекомендую вам вместо этого использовать CrmServiceClient. Этот класс можно найти в Microsoft.Xrm.Tooling .Соединитель dll. Это класс go to authentication при создании клиентских приложений Windows, которые подключаются к Microsoft Dynamics 365. Более подробную информацию об этом можно найти здесь
Вот пример того, как инициализировать CrmServiceClient при подключении к Dynamics 365 online с помощью Office 365:
var myConnectionString = "Url=https://[YourOrganization].crm4.dynamics.com;Username=[YourUser];Password=[YourPassword];AuthType=Office365;";
var crmClient = new CrmServiceClient(myConnectionString);
//Do your stuff
var response = crmClient.Execute(new WhoAmIRequest());
Если вам нужны другие методы аутентификации в Dynamics Online, проверьте, как создать строку подключения здесь.
Для локального использования проверьте, как создать строку подключения здесь.