Почему при создании IServiceManagement for Dynamics 365 конечная точка аутентификации отвечает HTML-страницей входа? - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть некоторый интеграционный код, который намеревается использовать службу организации через 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 со следующим сообщением об ошибке:

System.InvalidOperationException HResult = 0x80131509 Сообщение= Метаданные содержат ссылку, которая не может быть разрешена: 'https://login.microsoftonline.com/[guid]/oauth2/authorize?client_id=[some идентификатор клиента] & response_mode = form_post & response_type = code + id_token & scope = openid + profile & state = OpenIdConnect.AuthenticationProperties% [some base-64] RedirectTo% 3dhttps% 253a% 252f%252ftst-success.crm4.dynamics.com% 252f & nonce = [некоторые nonce] & redirect_uri = https:% 2f% 2fcloudredirector.crm4.dynamics.com% 2fG% 2fAuthRedirect% 2fIndex.aspx & max_age = 86400 '.Источник = System.ServiceModel StackTrace: в System.ServiceModel.Description.MetadataExchangeClient.MetadataRetriever.Retrieve (TimeoutHelper timeoutHelper) в System.ServiceModel.Description.MetadataExchangeClient.ResolveNext (ResolveCallState resolveCallState) в System.ServiceModel.Description.MetadataExchangeClient.GetMetadata (MetadataRetriever ретривера) в System.ServiceModel.Description.MetadataExchangeClient.GetMetadata (адрес Uri, режим MetadataExchangeClientMode) в Microsoft.Xrm.Sdk.Client.ServiceMetadataUtility.RetrieveServiceEndpointMetaer.service.evicerieServiceService.Exe`1..ctor (Uri serviceUri, логическое checkForSecondary) в Microsoft.Xrm.Sdk.Client.ServiceConfigurationFactory.CreateConfiguration [TService] (Uri serviceUri, логический enableProxyTypes, сборка сборки) в Microsoft.Xrm.Sdk.Client.FateConf_Configuration \TService] (Uri serviceUri) в CrmAuthTest.Program.Main (String [] args) в c: \ users \ t.wolverson \ Source \ Repos \ CrmAuthTest \ CrmAuthTest \ Program.cs: строка 18

Внутреннее исключение 1: XmlException: элементы CData недопустимы на верхнем уровнеXML документСтрока 1, позиция 3.

(я замаскировал биты, которые выглядят идентифицирующими или криптографическими)

POSTing к этому URL в PostMan выдает HTML-код для страницы входа в браузер, что объясняет ошибку;это не то, что ожидает ServiceConfigurationFactory.Сценарий не является интерактивным для пользователя, поэтому это никогда не будет иметь смысла, поскольку нет браузера и нет пользователя, способного с ним взаимодействовать.

Что мне нужно изменить в Dynamics CRM Online, чтобы он не делал этого,и заставить его просто нормально работать?

1 Ответ

1 голос
/ 09 апреля 2019

Вы создаете экземпляр своего 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.Connector dll. Это класс перехода к аутентификации при создании клиентских приложений Windows, которые подключаются к Microsoft Dynamics 365. Более подробную информацию об этом можно найти здесь

Вот пример того, как инициализировать CrmServiceClient при подключении к Dynamics 365 онлайн с помощью 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, проверьте, как создать строку подключения здесь .

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...