Я хочу подключить свой scim API к okta для подготовки пользователей. Невозможно интегрировать scim API с okta. Также не известно о шагах по интеграции. Буду очень признателен за любую помощь.
Я предоставляю код scim API, который собираюсь интегрировать с okta. UserController< /strong>
using System.Net;
using System.Security.Principal;
using System.Text;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json.Linq;
using ScimConnector1.Models;
using System.Threading;
using System.Net;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using ScimConnector1.BasicAuth;
using Group = ScimConnector1.Models.Group;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using static System.Net.Mime.MediaTypeNames;
using System.Net.Http.Formatting;
namespace ScimConnector1.Controllers
{
[Authorize]
[Route("scim/v2/[controller]")]
[ApiController]
//[BasicAuthentication]
public class UsersController : ControllerBase
{
ScimApi scimApi = new ScimApi();
//Create User
[HttpPost]
public HttpResponseMessage PostUser([FromBody] User userObject)
{
// Map the SCIM user to a local user object
var user = new User
{
id = userObject.id,
userName = userObject.userName,
name =new Name
{
givenName = userObject.name.givenName,
familyName = userObject.name.familyName,
},
emails = userObject.emails,
};
try
{
scimApi.AddUserToStore(user);
}
catch (Exception ex)
{
// Handle any errors that occur during user creation
return new HttpResponseMessage(HttpStatusCode.InternalServerError)
{
Content = new StringContent(ex.Message),
ReasonPhrase = "Error while creating user"
};
}
// Return the SCIM representation of the created user
var createdScimUser = new User
{
id = user.id,
userName = user.userName,
name=new Name
{
givenName = user.name.givenName,
familyName = user.name.familyName,
},
emails = user.emails,
};
var response = new HttpResponseMessage(HttpStatusCode.Created)
{
Content = new ObjectContent(createdScimUser, new JsonMediaTypeFormatter()),
};
response.Headers.Location = new Uri($"{Request.Scheme}://{Request.Host}/Groups/{createdScimUser.userName}");
return response;
}
//Get User
[HttpGet]
public IActionResult GetUser(string id)
{
// get user from your application here
User existingUser = scimApi.GetUserById(id);
// if user is not found in application, return 404
if (existingUser == null)
{
return NotFound();
}
else
{
return Ok(existingUser);
}
}
//Put user[update user]
[HttpPut]
public IActionResult UpdateUser(string id, [FromBody] User user)
{
// Implement your logic for updating a user by ID
User existingUser = scimApi.GetUserById(id);
if (existingUser == null)
{
return NotFound();
}
//existingUser.id = user.id;
existingUser.userName = user.userName;
existingUser.name = new Name
{
givenName = user.name.givenName,
familyName = user.name.familyName
};
existingUser.emails = user.emails;
// Update the user in your database or external system
scimApi.UpdateUserInDb
(existingUser.id, existingUser.userName, existingUser.name.familyName, existingUser.name.givenName, existingUser.emails);
return Ok(existingUser);
//return Ok(user);
}
}
}
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using ScimConnector1.Models;
using System.Net;
namespace ScimConnector1.Controllers
{
[Authorize]
[Route("scim/v2/[controller]")]
[ApiController]
public class GroupsController : ControllerBase
{
ScimApi scimApi = new ScimApi();
[HttpPost] //create Group
public IActionResult CreateGroup([FromBody] Group scimGroup)
{
// Map the SCIM group to a local Group object
var group = new Group
{
//Id = scimGroup.ExternalId,
DisplayName = scimGroup.DisplayName,
Description = scimGroup.Description,
//Members = scimGroup.Members.Select(m => m.id).ToList()
//Members = new List()
};
// Create the group in the database using the local group object
try
{
scimApi.CreateGroupInDb(group);
}
catch (Exception ex)
{
// Handle any errors that occur during group creation
return StatusCode(500, ex.Message);
}
// Return the SCIM representation of the created group
var createdScimGroup = new Group
{
//Id = group.Id,
//ExternalId = group.Id,
DisplayName = group.DisplayName,
Description = group.Description,
//Members = scimGroup.Members.Select(m => new User { id = m}).ToList()
};
return Created($"{Request.Scheme}://{Request.Host}/Groups/{createdScimGroup.DisplayName}", createdScimGroup);
}
[HttpGet] //get Group
public HttpResponseMessage GetGroup(HttpRequestMessage request, string id)
{
Group existingGroup = scimApi.GetGroupById(id);
// get group from app
if (existingGroup != null)
{
return request.CreateResponse(HttpStatusCode.OK, existingGroup);
}
else
{
return request.CreateResponse(HttpStatusCode.NotFound);
}
}
[HttpPut] //update Group
public IActionResult PutGroup(String id, Group group)
{
// update group in app
Group existingGroup = scimApi.GetGroupById(id);
if (existingGroup == null)
{
return NotFound();
}
//existingUser.id = user.id;
existingGroup.DisplayName = group.DisplayName;
existingGroup.Description = group.Description;
// Update the user in your database or external system
scimApi.UpdateGroupInDb(id, existingGroup.DisplayName, existingGroup.Description);
return Ok(existingGroup);
}
}
}
ScimApi.cs: где присутствуют все методы, вызываемые контроллерами
using System.Data;
using System.Data.SqlClient;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Npgsql;
namespace ScimConnector1.Models
{
public class ScimApi
{
public string connectionString = "Port=XXXXX; Host=XXXXXXXX; Database=XXXXX;User Id=XXXXX;Password=XXXXX;";
public void AddUserToStore(User user)
{
// Add the user to your app's user store
// create a new database connection using the provided connection string
using (var conn = new
NpgsqlConnection(connectionString))
{
// open the database connection
conn.Open();
var command = new NpgsqlCommand("INSERT INTO Users (Id, UserName, FirstName, LastName, Email) " +
"VALUES (@Id, @UserName, @FirstName, @LastName, @Email)", conn);
command.Parameters.AddWithValue("@Id", user.id);
command.Parameters.AddWithValue("@UserName", user.userName);
command.Parameters.AddWithValue("@FirstName", user.name.givenName);
command.Parameters.AddWithValue("@LastName", user.name.familyName);
command.Parameters.AddWithValue("@Email", user.emails);
int rowsAffected = command.ExecuteNonQuery();
if (rowsAffected != 1)
{
throw new Exception($"Failed to insert user with id {user.id} into database.");
}
}
}
public User GetUserById(string id)
{
User user = null;
using (NpgsqlConnection connection = new NpgsqlConnection(connectionString))
{
connection.Open();
using (NpgsqlCommand command = new NpgsqlCommand("SELECT * FROM users WHERE id = @id", connection))
{
command.Parameters.Add(new NpgsqlParameter("id", DbType.String)).Value = id;
using (NpgsqlDataReader reader = command.ExecuteReader())
{
if (reader.Read())
{
user = new User
{
id = reader.GetString(reader.GetOrdinal("id")),
userName = reader.GetString(reader.GetOrdinal("username")),
name=new Name
{
givenName = reader.GetString(reader.GetOrdinal("firstName")),
familyName = reader.GetString(reader.GetOrdinal("lastName")),
},
emails = reader.GetString(reader.GetOrdinal("email"))
};
}
}
}
}
return user;
}
public void UpdateUserInDb(string id, string userName, string firstName, string lastName, string email)
{
using (NpgsqlConnection connection = new NpgsqlConnection(connectionString))
{
connection.Open();
using (NpgsqlCommand command = new NpgsqlCommand("UPDATE users SET username=@userName, firstName = @firstName, lastName = @lastName, email = @email WHERE id = @id", connection))
{
command.Parameters.AddWithValue("@id", id);
command.Parameters.AddWithValue("@username", userName);
command.Parameters.AddWithValue("@firstName", firstName);
command.Parameters.AddWithValue("@lastName", lastName);
command.Parameters.AddWithValue("@email", email);
command.ExecuteNonQuery();
}
}
}
public Group GetGroupById(string id)
{
Group group = null;
using (NpgsqlConnection connection = new NpgsqlConnection(connectionString))
{
connection.Open();
using (NpgsqlCommand command = new NpgsqlCommand("SELECT * FROM groups WHERE id = @id", connection))
{
command.Parameters.Add(new NpgsqlParameter("id", DbType.String)).Value = id;
using (NpgsqlDataReader reader = command.ExecuteReader())
{
if (reader.Read())
{
group = new Group
{
//id = reader.GetString(reader.GetOrdinal("id")),
DisplayName = reader.GetString(reader.GetOrdinal("displayname")),
Description = reader.GetString(reader.GetOrdinal("description")),
};
}
}
}
}
return group;
}
public void UpdateGroupInDb(string id ,string DisplayName,string Discription)
{
using (NpgsqlConnection connection = new NpgsqlConnection(connectionString))
{
connection.Open();
using (NpgsqlCommand command = new NpgsqlCommand("UPDATE groups SET DisplayName=@displayName, description= @Description WHERE id = @id", connection))
{
//command.Parameters.AddWithValue("@id", id);
command.Parameters.AddWithValue("@DisplayName", DisplayName);
command.Parameters.AddWithValue("@Description", Discription);
command.ExecuteNonQuery();
}
}
}
public void CreateGroupInDb(Group group)
{
//string connectionStringToGroup = "Server=TestServer;Port=2001; Host=127.0.0.1; Database=groups;User Id=Drona;Password=12345;";
using (var connection = new NpgsqlConnection(connectionString))
{
connection.Open();
using (var command = new NpgsqlCommand("INSERT INTO groups (displayname,discription) VALUES (@displayName,@discription)", connection))
{
//command.Parameters.AddWithValue("id", group.Id);
command.Parameters.AddWithValue("displayName", group.DisplayName);
command.Parameters.AddWithValue("discription", group.Description);
//command.Parameters.AddWithValue("members", JsonConvert.SerializeObject(group.Members));
command.ExecuteNonQuery();
}
connection.Close();
}
}
}
}
Это код scim API, который я использую для интеграции с okta.
здесь я хочу, чтобы мой scim API передавал данные из okta в мое приложение (попробуйте, теперь это база данных ). Также размещен приведенный выше код в Azure.
Пожалуйста, дайте мне знать, как правильно интегрировать приведенный выше код API scim с okta. Я использую базовую аутентификацию в scim API.
![1]: https://i.sstatic.net/4QVKv.png
Это изображение платформы okta, приложение в okta — это тестовое приложение scim api (базовая аутентификация).
На изображении я указал базовый URL-адрес моего scim API с аутентификацией. credential. Когда я нажимаю «Проверить учетные данные API», я получаю сообщение об ошибке «Ошибка аутентификации: неверный запрос. Ошибки, сообщенные удаленным сервером:» (как на изображении).
Пожалуйста. дайте мне знать, какие изменения необходимо внести в мой API, или дайте мне знать, какие шаги необходимо предпринять для интеграции scim.
Я хочу подключить свой scim API к okta для подготовки пользователей. Невозможно интегрировать scim API с okta. Также не известно о шагах по интеграции. Буду очень признателен за любую помощь. Я предоставляю код scim API, который собираюсь интегрировать с okta. [b]UserController< /strong> [code]using System.Net; using System.Security.Principal; using System.Text; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json.Linq; using ScimConnector1.Models; using System.Threading; using System.Net; using System.Collections.Generic; using System.Text.RegularExpressions; using ScimConnector1.BasicAuth; using Group = ScimConnector1.Models.Group; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using static System.Net.Mime.MediaTypeNames; using System.Net.Http.Formatting;
namespace ScimConnector1.Controllers { [Authorize] [Route("scim/v2/[controller]")] [ApiController] //[BasicAuthentication] public class UsersController : ControllerBase { ScimApi scimApi = new ScimApi();
//Create User [HttpPost] public HttpResponseMessage PostUser([FromBody] User userObject) { // Map the SCIM user to a local user object var user = new User { id = userObject.id, userName = userObject.userName, name =new Name { givenName = userObject.name.givenName, familyName = userObject.name.familyName, }, emails = userObject.emails, };
try { scimApi.AddUserToStore(user); } catch (Exception ex) { // Handle any errors that occur during user creation return new HttpResponseMessage(HttpStatusCode.InternalServerError) { Content = new StringContent(ex.Message), ReasonPhrase = "Error while creating user" }; }
// Return the SCIM representation of the created user var createdScimUser = new User { id = user.id, userName = user.userName, name=new Name { givenName = user.name.givenName, familyName = user.name.familyName, }, emails = user.emails, };
var response = new HttpResponseMessage(HttpStatusCode.Created) { Content = new ObjectContent(createdScimUser, new JsonMediaTypeFormatter()), };
response.Headers.Location = new Uri($"{Request.Scheme}://{Request.Host}/Groups/{createdScimUser.userName}");
return response; }
//Get User [HttpGet] public IActionResult GetUser(string id) { // get user from your application here User existingUser = scimApi.GetUserById(id);
// if user is not found in application, return 404 if (existingUser == null) { return NotFound(); } else { return Ok(existingUser); } }
//Put user[update user] [HttpPut] public IActionResult UpdateUser(string id, [FromBody] User user) { // Implement your logic for updating a user by ID User existingUser = scimApi.GetUserById(id);
if (existingUser == null) { return NotFound(); } //existingUser.id = user.id; existingUser.userName = user.userName; existingUser.name = new Name { givenName = user.name.givenName, familyName = user.name.familyName }; existingUser.emails = user.emails;
// Update the user in your database or external system scimApi.UpdateUserInDb (existingUser.id, existingUser.userName, existingUser.name.familyName, existingUser.name.givenName, existingUser.emails);
return Ok(existingUser);
//return Ok(user); }
} } [/code]
GroupController[/b] [code]using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using ScimConnector1.Models; using System.Net;
namespace ScimConnector1.Controllers { [Authorize] [Route("scim/v2/[controller]")] [ApiController] public class GroupsController : ControllerBase { ScimApi scimApi = new ScimApi();
[HttpPost] //create Group public IActionResult CreateGroup([FromBody] Group scimGroup) { // Map the SCIM group to a local Group object var group = new Group { //Id = scimGroup.ExternalId, DisplayName = scimGroup.DisplayName, Description = scimGroup.Description, //Members = scimGroup.Members.Select(m => m.id).ToList() //Members = new List() };
// Create the group in the database using the local group object try { scimApi.CreateGroupInDb(group); } catch (Exception ex) { // Handle any errors that occur during group creation return StatusCode(500, ex.Message); }
// Return the SCIM representation of the created group var createdScimGroup = new Group { //Id = group.Id, //ExternalId = group.Id, DisplayName = group.DisplayName, Description = group.Description, //Members = scimGroup.Members.Select(m => new User { id = m}).ToList() };
[HttpGet] //get Group public HttpResponseMessage GetGroup(HttpRequestMessage request, string id) { Group existingGroup = scimApi.GetGroupById(id); // get group from app
[HttpPut] //update Group public IActionResult PutGroup(String id, Group group) { // update group in app Group existingGroup = scimApi.GetGroupById(id);
// Update the user in your database or external system scimApi.UpdateGroupInDb(id, existingGroup.DisplayName, existingGroup.Description);
return Ok(existingGroup);
}
} } [/code]
[b]ScimApi.cs: где присутствуют все методы, вызываемые контроллерами[/b] [code]using System.Data; using System.Data.SqlClient; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Npgsql;
namespace ScimConnector1.Models { public class ScimApi { public string connectionString = "Port=XXXXX; Host=XXXXXXXX; Database=XXXXX;User Id=XXXXX;Password=XXXXX;";
public void AddUserToStore(User user) { // Add the user to your app's user store
// create a new database connection using the provided connection string using (var conn = new NpgsqlConnection(connectionString)) { // open the database connection conn.Open();
var command = new NpgsqlCommand("INSERT INTO Users (Id, UserName, FirstName, LastName, Email) " + "VALUES (@Id, @UserName, @FirstName, @LastName, @Email)", conn);
if (rowsAffected != 1) { throw new Exception($"Failed to insert user with id {user.id} into database."); }
} }
public User GetUserById(string id) { User user = null;
using (NpgsqlConnection connection = new NpgsqlConnection(connectionString)) { connection.Open();
using (NpgsqlCommand command = new NpgsqlCommand("SELECT * FROM users WHERE id = @id", connection)) { command.Parameters.Add(new NpgsqlParameter("id", DbType.String)).Value = id;
using (NpgsqlDataReader reader = command.ExecuteReader()) { if (reader.Read()) { user = new User { id = reader.GetString(reader.GetOrdinal("id")), userName = reader.GetString(reader.GetOrdinal("username")), name=new Name { givenName = reader.GetString(reader.GetOrdinal("firstName")), familyName = reader.GetString(reader.GetOrdinal("lastName")), }, emails = reader.GetString(reader.GetOrdinal("email")) }; } } } }
return user; }
public void UpdateUserInDb(string id, string userName, string firstName, string lastName, string email) { using (NpgsqlConnection connection = new NpgsqlConnection(connectionString)) { connection.Open();
using (NpgsqlCommand command = new NpgsqlCommand("UPDATE users SET username=@userName, firstName = @firstName, lastName = @lastName, email = @email WHERE id = @id", connection)) { command.Parameters.AddWithValue("@id", id); command.Parameters.AddWithValue("@username", userName); command.Parameters.AddWithValue("@firstName", firstName); command.Parameters.AddWithValue("@lastName", lastName); command.Parameters.AddWithValue("@email", email);
command.ExecuteNonQuery(); } } }
public Group GetGroupById(string id) {
Group group = null;
using (NpgsqlConnection connection = new NpgsqlConnection(connectionString)) { connection.Open();
using (NpgsqlCommand command = new NpgsqlCommand("SELECT * FROM groups WHERE id = @id", connection)) { command.Parameters.Add(new NpgsqlParameter("id", DbType.String)).Value = id;
using (NpgsqlDataReader reader = command.ExecuteReader()) { if (reader.Read()) { group = new Group { //id = reader.GetString(reader.GetOrdinal("id")), DisplayName = reader.GetString(reader.GetOrdinal("displayname")), Description = reader.GetString(reader.GetOrdinal("description")), }; } } } }
return group; }
public void UpdateGroupInDb(string id ,string DisplayName,string Discription) { using (NpgsqlConnection connection = new NpgsqlConnection(connectionString)) { connection.Open();
using (NpgsqlCommand command = new NpgsqlCommand("UPDATE groups SET DisplayName=@displayName, description= @Description WHERE id = @id", connection)) { //command.Parameters.AddWithValue("@id", id); command.Parameters.AddWithValue("@DisplayName", DisplayName); command.Parameters.AddWithValue("@Description", Discription);
command.ExecuteNonQuery(); } } }
public void CreateGroupInDb(Group group) { //string connectionStringToGroup = "Server=TestServer;Port=2001; Host=127.0.0.1; Database=groups;User Id=Drona;Password=12345;"; using (var connection = new NpgsqlConnection(connectionString)) { connection.Open();
using (var command = new NpgsqlCommand("INSERT INTO groups (displayname,discription) VALUES (@displayName,@discription)", connection)) { //command.Parameters.AddWithValue("id", group.Id); command.Parameters.AddWithValue("displayName", group.DisplayName); command.Parameters.AddWithValue("discription", group.Description); //command.Parameters.AddWithValue("members", JsonConvert.SerializeObject(group.Members));
command.ExecuteNonQuery(); }
connection.Close(); } } } } [/code] Это код scim API, который я использую для интеграции с okta. здесь я хочу, чтобы мой scim API передавал данные из okta в мое приложение (попробуйте, теперь это база данных ). Также размещен приведенный выше код в Azure. Пожалуйста, дайте мне знать, как правильно интегрировать приведенный выше код API scim с okta. Я использую базовую аутентификацию в scim API. ![1]: https://i.sstatic.net/4QVKv.png Это изображение платформы okta, приложение в okta — это тестовое приложение scim api (базовая аутентификация). На изображении я указал базовый URL-адрес моего scim API с аутентификацией. credential. Когда я нажимаю «Проверить учетные данные API», я получаю сообщение об ошибке «Ошибка аутентификации: неверный запрос. Ошибки, сообщенные удаленным сервером:» (как на изображении). Пожалуйста. дайте мне знать, какие изменения необходимо внести в мой API, или дайте мне знать, какие шаги необходимо предпринять для интеграции scim.
Я выполняю подготовку SCIM из Azure и сопоставляю атрибуты по умолчанию в настройках сопоставления атрибутов. Я добавил 5 пользователей в «devtestgroup», но при отправке запросов Azure отправляет только externalId и displayName, а не участников....
Я выполняю подготовку SCIM из Azure и сопоставляю атрибуты по умолчанию в настройках сопоставления атрибутов. Я добавил 5 пользователей в «devtestgroup», но при отправке запросов Azure отправляет только externalId и displayName, а не участников....
У меня есть пользовательский интерфейс React. Мне нужно реализовать веб-приложение Okta с аутентификацией на стороне сервера. Сервер, который я использую, — Python. Не удалось устранить проблему, из-за которой Okta выдавала эту ошибку:...
У меня есть рабочий процесс предоставления гранта/PKCE для нашего приложения SPA, который позволяет запросить токен доступа в Okta и отправить его на сервер ресурсов.
Часть SPA -> Okta решена, и отправка токена на мой сервер ресурсов Java проста....