Почему при создании IServiceManagement для Dynamics 365 конечная точка аутентификации отвечает страницей входа в HTML?

#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, проверьте, как создать строку подключения здесь.

Для локального использования проверьте, как создать строку подключения здесь.