Получение ПЛОХОГО ЗАПРОСА при вызове Okta API из приложения C # MVC

Я создаю образец приложения (то есть доказательство концепции) для создания пользователей с платформой Okta. Я использую вызовы API, но постоянно получаю сообщение «ПЛОХОЙ ЗАПРОС» при запуске приложения C # MVC из Visual Studio 2013 с обновлением 5 до моего экземпляра разработки Okta. Мне интересно, связана ли проблема между CORS и локальным приложением?

Вот что у меня есть на данный момент:

  • Протестировал вызовы API с помощью Postman в моей среде разработки, и вызовы работают (т.е. пользователи создаются в моей среде администратора Okta dev)

  • Создайте токен API и вызовите его с префиксом «SSWS» в заголовке авторизации.

  • Использование методов HttpClient и .PostAsJsonAsync() для вызова API

  • Мой код приложения работает должным образом при вызове GET с вызовом API /api/v1/users?limit=25 и .GetAsync()

  • Используя следующий вызов Api: / api / v1 / users? Activate = false (создать пользователя с паролем; это работает в Postman, но не в приложении MVC)

  • Используется http://json2csharp.com/ для создания классов C #, которые соответствуют иерархии JSON Okta (полученные из Okta Postman API библиотеки)

  • Используя приведенные выше классы, JSON, отображаемый в средстве просмотра текста Visual Studio (полученный при пошаговом выполнении кода), работает с вызовом POST при вставке в Postman.

  • HttpResponse содержит сообщение об ошибке "Тело запроса было неправильно сформировано".

Вот код, используемый для создания и сериализации (с Json.NET) классов C #:

            RootObject root = new RootObject();
            root.profile = new Profile();
            root.profile.firstName = model.FirstName;
            root.profile.lastName = model.LastName;
            root.profile.email = model.Email;
            root.profile.login = model.UserName;

            root.credentials = new Credentials();
            root.credentials.password = new OktaTest.Models.Password();
            root.credentials.password.value = model.Password;

            string rootJson = JsonConvert.SerializeObject(root);

Это создает следующий JSON (он содержит фиктивные данные):

{"profile":{"firstName":"Test","lastName":"User","email":"[email protected]","login":"[email protected]"},"credentials":{"password":{"value":"Testing123"}}}

Вот строка кода, которая выполняет вызов POST:

HttpResponseMessage responseMessage = await client.PostAsJsonAsync(url, rootJson);

Вот строка, которая устанавливает заголовок Accept:

client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

Поскольку я могу использовать JSON в Postman, и поскольку этот JSON оказывается действительным при использовании JSONLint, я думаю, что проблема не в JSON, а в безопасности между моим локальным приложением и средой разработки. Следует ли запускать этот тест только из размещенного приложения, чтобы сайт можно было явно назначить в разделе CORS административной среды Okta? На данный момент, а я все еще исследую и экспериментирую, я не уверен, что мне не хватает, но я думаю, что близок.

Будем очень признательны за любые советы или рекомендации! Спасибо!


person ewomack    schedule 08.11.2016    source источник
comment
Можете ли вы проверить правильность установки headers для объекта client?   -  person Searching    schedule 08.11.2016
comment
@Searching - Да, я так думаю; Я обновил пост и включил создание заголовка Accept.   -  person ewomack    schedule 09.11.2016
comment
@ewomack Вы пробовали использовать Okta C # SDK вместо прямого вызова API? (nuget.org/packages/Okta.Core.Client). Вы найдете два образца кода командной строки, показывающие, как использовать этот SDK с API аутентификации и пользователей, на странице github.com/oktadeveloper, и в этом SDK доступен метод UsersClient.Add. Сообщите мне, если это поможет!   -  person Raphael Londner    schedule 09.11.2016
comment
@RaphaelLondner Да, я использовал его, и я согласен, что им проще пользоваться. Достаточно ли он гибок, чтобы обрабатывать различные сценарии, такие как создание пользователей в качестве поэтапных и отправка им электронных писем в определенное время? У меня были проблемы с некоторыми сценариями использования SDK. Но если он достаточно гибкий, я вернусь к нему.   -  person ewomack    schedule 09.11.2016


Ответы (1)


Я рекомендую вам использовать Okta C # SDK, который вы можете добавить в свое приложение с помощью NuGet-пакет Okta.Core.Client.

В примере консольного приложения показано, как использовать его для создания пользователей Okta : https://github.com/oktadeveloper/okta-sdk-dotnet-console-user-create

Надеюсь, это поможет!

person Raphael Londner    schedule 09.11.2016
comment
Мне удалось создать (в основном) желаемый сценарий с Okta SDK, используя следующие строки кода: Пользователь OktaReturnUser = OktaClient.GetUsersClient (). Add (OktaSendUser, false); OktaClient.GetUsersClient (). Активировать (OktaReturnUser, true); Они создают поэтапного пользователя, а затем отправляют электронное письмо, чтобы задать вопрос о безопасности / сбросе пароля. Это было проще, чем проблемы, с которыми я столкнулся, называть API прямо. - person ewomack; 09.11.2016
comment
Это действительно правильные вызовы через C # SDK :-) Рад знать, что это сработало для вас! - person Raphael Londner; 10.11.2016