从 C# MVC 应用程序调用 Okta API 时收到错误请求
Receiving BAD REQUEST when called Okta API from C# MVC application
我正在创建一个示例应用程序(即概念证明),用于使用 Okta 平台创建用户。我正在使用 API 调用,但当 运行 将 C# MVC 应用程序从 Visual Studio 2013 更新 5 连接到我的 Okta 开发实例时,我一直收到 "BAD REQUEST"。我想知道问题是否出在 CORS 和本地应用程序之间?
这是我目前的情况:
测试了使用 Postman 对我的开发环境的 API 调用并且调用有效(即,用户是在我的 Okta 开发管理环境中创建的)
创建了一个 API 令牌并在授权 header
中使用前缀 "SSWS" 调用它
使用 HttpClient
和 .PostAsJsonAsync()
方法进行 API 调用
我的应用程序代码在使用 API 调用 /api/v1/users?limit=25
和 .GetAsync()
调用 GET 时按预期工作
使用以下 Api 调用:/api/v1/users?activate=false(创建一个带密码的用户;这适用于 Postman,但不适用于 MVC 应用程序)
使用 http://json2csharp.com/ 创建符合 Okta 的 JSON 层次结构的 C# 类(从 Okta 的 Postman API 库中获得)
使用上面的 类,Visual Studio 的文本查看器中显示的 JSON(在单步执行代码时获得)与 POST 粘贴到 Postman 时调用
HttpResponse
包含错误信息 "The request body was not well-formed"
这是用于创建和序列化(使用 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":"user@test.org","login":"user@test.org"},"credentials":{"password":{"value":"Testing123"}}}
这是调用 POST 的代码行:
HttpResponseMessage responseMessage = await client.PostAsJsonAsync(url, rootJson);
这是设置接受的行 header:
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
由于我能够在 Postman 中使用 JSON,并且由于 JSON 在使用 JSONLint 时有效,我认为问题在于不是 JSON 而是我的本地应用程序和开发环境之间的安全问题。此测试是否应该仅来自托管应用程序 运行,以便可以在 Okta 管理环境的 CORS 部分中显式分配站点?在这一点上,我仍在研究和试验,我不确定我错过了什么,但我想我已经接近了。
如有任何建议或指导,我们将不胜感激!谢谢!
我推荐你使用Okta C# SDK which you can add to your application using the Okta.Core.Client NuGet package。
示例控制台应用程序展示了如何使用它 create Okta users: https://github.com/oktadeveloper/okta-sdk-dotnet-console-user-create
希望对您有所帮助!
我正在创建一个示例应用程序(即概念证明),用于使用 Okta 平台创建用户。我正在使用 API 调用,但当 运行 将 C# MVC 应用程序从 Visual Studio 2013 更新 5 连接到我的 Okta 开发实例时,我一直收到 "BAD REQUEST"。我想知道问题是否出在 CORS 和本地应用程序之间?
这是我目前的情况:
测试了使用 Postman 对我的开发环境的 API 调用并且调用有效(即,用户是在我的 Okta 开发管理环境中创建的)
创建了一个 API 令牌并在授权 header
中使用前缀 "SSWS" 调用它
使用
HttpClient
和.PostAsJsonAsync()
方法进行 API 调用我的应用程序代码在使用 API 调用
/api/v1/users?limit=25
和.GetAsync()
调用 GET 时按预期工作
使用以下 Api 调用:/api/v1/users?activate=false(创建一个带密码的用户;这适用于 Postman,但不适用于 MVC 应用程序)
使用 http://json2csharp.com/ 创建符合 Okta 的 JSON 层次结构的 C# 类(从 Okta 的 Postman API 库中获得)
使用上面的 类,Visual Studio 的文本查看器中显示的 JSON(在单步执行代码时获得)与 POST 粘贴到 Postman 时调用
HttpResponse
包含错误信息 "The request body was not well-formed"
这是用于创建和序列化(使用 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":"user@test.org","login":"user@test.org"},"credentials":{"password":{"value":"Testing123"}}}
这是调用 POST 的代码行:
HttpResponseMessage responseMessage = await client.PostAsJsonAsync(url, rootJson);
这是设置接受的行 header:
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
由于我能够在 Postman 中使用 JSON,并且由于 JSON 在使用 JSONLint 时有效,我认为问题在于不是 JSON 而是我的本地应用程序和开发环境之间的安全问题。此测试是否应该仅来自托管应用程序 运行,以便可以在 Okta 管理环境的 CORS 部分中显式分配站点?在这一点上,我仍在研究和试验,我不确定我错过了什么,但我想我已经接近了。
如有任何建议或指导,我们将不胜感激!谢谢!
我推荐你使用Okta C# SDK which you can add to your application using the Okta.Core.Client NuGet package。
示例控制台应用程序展示了如何使用它 create Okta users: https://github.com/oktadeveloper/okta-sdk-dotnet-console-user-create
希望对您有所帮助!