From bb13320209597e012b3d65fdc050545944e22e0c Mon Sep 17 00:00:00 2001 From: Galip Tolga Erdem Date: Mon, 24 Jul 2023 17:19:35 -0400 Subject: [PATCH] Added KeycloakService --- .../BackgroundJobs/KeycloakClientOptions.cs | 9 --- .../IdentityServiceApplicationModule.cs | 2 +- .../Keycloak/KeycloakClientOptions.cs | 8 +++ .../Keycloak/KeycloakService.cs | 66 +++++++++++++++++++ 4 files changed, 75 insertions(+), 10 deletions(-) delete mode 100644 services/identity/src/EShopOnAbp.IdentityService.Application/BackgroundJobs/KeycloakClientOptions.cs create mode 100644 services/identity/src/EShopOnAbp.IdentityService.Application/Keycloak/KeycloakClientOptions.cs create mode 100644 services/identity/src/EShopOnAbp.IdentityService.Application/Keycloak/KeycloakService.cs diff --git a/services/identity/src/EShopOnAbp.IdentityService.Application/BackgroundJobs/KeycloakClientOptions.cs b/services/identity/src/EShopOnAbp.IdentityService.Application/BackgroundJobs/KeycloakClientOptions.cs deleted file mode 100644 index 648a3823..00000000 --- a/services/identity/src/EShopOnAbp.IdentityService.Application/BackgroundJobs/KeycloakClientOptions.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace EShopOnAbp.IdentityService.BackgroundJobs; - -public class KeycloakClientOptions -{ - public string Url { get; set; } - public string AdminUserName { get; set; } - public string AdminPassword { get; set; } - public string RealmName { get; set; } -} \ No newline at end of file diff --git a/services/identity/src/EShopOnAbp.IdentityService.Application/IdentityServiceApplicationModule.cs b/services/identity/src/EShopOnAbp.IdentityService.Application/IdentityServiceApplicationModule.cs index c0b7e66f..cd2aacb1 100644 --- a/services/identity/src/EShopOnAbp.IdentityService.Application/IdentityServiceApplicationModule.cs +++ b/services/identity/src/EShopOnAbp.IdentityService.Application/IdentityServiceApplicationModule.cs @@ -1,4 +1,4 @@ -using EShopOnAbp.IdentityService.BackgroundJobs; +using EShopOnAbp.IdentityService.Keycloak; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.AutoMapper; using Volo.Abp.BackgroundJobs; diff --git a/services/identity/src/EShopOnAbp.IdentityService.Application/Keycloak/KeycloakClientOptions.cs b/services/identity/src/EShopOnAbp.IdentityService.Application/Keycloak/KeycloakClientOptions.cs new file mode 100644 index 00000000..93850fa2 --- /dev/null +++ b/services/identity/src/EShopOnAbp.IdentityService.Application/Keycloak/KeycloakClientOptions.cs @@ -0,0 +1,8 @@ +namespace EShopOnAbp.IdentityService.Keycloak; + public class KeycloakClientOptions + { + public string Url { get; set; } + public string AdminUserName { get; set; } + public string AdminPassword { get; set; } + public string RealmName { get; set; } + } \ No newline at end of file diff --git a/services/identity/src/EShopOnAbp.IdentityService.Application/Keycloak/KeycloakService.cs b/services/identity/src/EShopOnAbp.IdentityService.Application/Keycloak/KeycloakService.cs new file mode 100644 index 00000000..19da1314 --- /dev/null +++ b/services/identity/src/EShopOnAbp.IdentityService.Application/Keycloak/KeycloakService.cs @@ -0,0 +1,66 @@ +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Keycloak.Net; +using Keycloak.Net.Models.Roles; +using Keycloak.Net.Models.Users; +using Microsoft.Extensions.Options; +using Volo.Abp.DependencyInjection; + +namespace EShopOnAbp.IdentityService.Keycloak; + +public class KeycloakService : ITransientDependency +{ + private readonly KeycloakClient _keycloakClient; + private readonly KeycloakClientOptions _keycloakOptions; + + public KeycloakService(IOptions keycloakOptions) + { + _keycloakOptions = keycloakOptions.Value; + + _keycloakClient = new KeycloakClient( + _keycloakOptions.Url, + _keycloakOptions.AdminUserName, + _keycloakOptions.AdminPassword + ); + } + + public Task> GetUsersAsync(string search = null, string username = null, string email = null, + CancellationToken cancellationToken = default) + { + return _keycloakClient.GetUsersAsync(_keycloakOptions.RealmName, search: search, username: username, + email: email, cancellationToken: cancellationToken); + } + + public Task GetUserAsync(string userId, CancellationToken cancellationToken = default) + { + return _keycloakClient.GetUserAsync(_keycloakOptions.RealmName, userId, cancellationToken: cancellationToken); + } + + public Task CreateUserAsync(User user, CancellationToken cancellationToken = default) + { + return _keycloakClient.CreateUserAsync(_keycloakOptions.RealmName, user, cancellationToken); + } + + public Task UpdateUserAsync(string userId, User user, CancellationToken cancellationToken = default) + { + return _keycloakClient.UpdateUserAsync(_keycloakOptions.RealmName, userId, user, cancellationToken); + } + + public Task DeleteUserAsync(string userId, CancellationToken cancellationToken = default) + { + return _keycloakClient.DeleteUserAsync(_keycloakOptions.RealmName, userId, cancellationToken); + } + + public Task> GetRolesAsync(CancellationToken cancellationToken = default) + { + return _keycloakClient.GetRolesAsync(_keycloakOptions.RealmName, cancellationToken: cancellationToken); + } + + public Task AddRolesToUserAsync(string userId, IEnumerable roles, + CancellationToken cancellationToken = default) + { + return _keycloakClient.AddRealmRoleMappingsToUserAsync(_keycloakOptions.RealmName, userId, roles, + cancellationToken); + } +} \ No newline at end of file