|
|
|
@ -1,43 +1,36 @@ |
|
|
|
using System; |
|
|
|
using System.Collections.Generic; |
|
|
|
using System.Linq; |
|
|
|
using System.Threading.Tasks; |
|
|
|
using Keycloak.Net; |
|
|
|
using Keycloak.Net.Models.Users; |
|
|
|
using EShopOnAbp.IdentityService.Keycloak; |
|
|
|
using Microsoft.Extensions.Logging; |
|
|
|
using Microsoft.Extensions.Options; |
|
|
|
using Volo.Abp.BackgroundJobs; |
|
|
|
using Volo.Abp.DependencyInjection; |
|
|
|
using Keycloak.Net.Models.Users; |
|
|
|
|
|
|
|
namespace EShopOnAbp.IdentityService.BackgroundJobs; |
|
|
|
namespace EShopOnAbp.IdentityService.BackgroundJobs.User; |
|
|
|
|
|
|
|
public class KeycloakUserCreationJob : AsyncBackgroundJob<IdentityUserCreationArgs>, ITransientDependency |
|
|
|
{ |
|
|
|
private readonly KeycloakClient _keycloakClient; |
|
|
|
private readonly KeycloakClientOptions _keycloakOptions; |
|
|
|
private readonly ILogger<KeycloakUserCreationJob> _logger; |
|
|
|
private readonly KeycloakService _keycloakService; |
|
|
|
private readonly ILogger _logger; |
|
|
|
|
|
|
|
public KeycloakUserCreationJob(IOptions<KeycloakClientOptions> keycloakOptions, |
|
|
|
public KeycloakUserCreationJob(KeycloakService keycloakService, |
|
|
|
ILogger<KeycloakUserCreationJob> logger) |
|
|
|
{ |
|
|
|
_logger = logger; |
|
|
|
_keycloakOptions = keycloakOptions.Value; |
|
|
|
|
|
|
|
_keycloakClient = new KeycloakClient( |
|
|
|
_keycloakOptions.Url, |
|
|
|
_keycloakOptions.AdminUserName, |
|
|
|
_keycloakOptions.AdminPassword |
|
|
|
); |
|
|
|
_keycloakService = keycloakService; |
|
|
|
} |
|
|
|
|
|
|
|
public override async Task ExecuteAsync(IdentityUserCreationArgs args) |
|
|
|
{ |
|
|
|
var keycloakUser = new User |
|
|
|
var keycloakUser = new global::Keycloak.Net.Models.Users.User() |
|
|
|
{ |
|
|
|
Email = args.Email, |
|
|
|
UserName = args.UserName, |
|
|
|
FirstName = args.Name, |
|
|
|
LastName = args.Surname, |
|
|
|
Enabled = true, |
|
|
|
Enabled = args.IsActive, |
|
|
|
Credentials = new List<Credentials>() |
|
|
|
{ |
|
|
|
new() { Type = "password", Value = args.Password } |
|
|
|
@ -46,9 +39,14 @@ public class KeycloakUserCreationJob : AsyncBackgroundJob<IdentityUserCreationAr |
|
|
|
|
|
|
|
try |
|
|
|
{ |
|
|
|
var result = await _keycloakClient.CreateUserAsync(_keycloakOptions.RealmName, keycloakUser); |
|
|
|
var result = await _keycloakService.CreateUserAsync(keycloakUser); |
|
|
|
if (result) |
|
|
|
{ |
|
|
|
if (args.RoleNames.Length != 0) |
|
|
|
{ |
|
|
|
await AddRolesToKeycloakUserAsync(keycloakUser.UserName, args.RoleNames); |
|
|
|
} |
|
|
|
|
|
|
|
_logger.LogInformation($"Keycloak user with the username:{args.UserName} has been created."); |
|
|
|
} |
|
|
|
} |
|
|
|
@ -58,6 +56,16 @@ public class KeycloakUserCreationJob : AsyncBackgroundJob<IdentityUserCreationAr |
|
|
|
throw; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private async Task AddRolesToKeycloakUserAsync(string userName, string[] roleNames) |
|
|
|
{ |
|
|
|
var user = (await _keycloakService.GetUsersAsync(username: userName)).First(); |
|
|
|
var allTheRoles = await _keycloakService.GetRolesAsync(); |
|
|
|
var roles = allTheRoles.Where(q => roleNames.Contains(q.Name)); |
|
|
|
|
|
|
|
await _keycloakService.AddRolesToUserAsync(user.Id, roles); |
|
|
|
_logger.LogInformation($"Keycloak roles:{roleNames} has been added to user with the username:{userName}."); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public class IdentityUserCreationArgs |
|
|
|
@ -67,4 +75,6 @@ public class IdentityUserCreationArgs |
|
|
|
public string Name { get; set; } |
|
|
|
public string Surname { get; set; } |
|
|
|
public string Password { get; set; } |
|
|
|
public bool IsActive { get; set; } |
|
|
|
public string[] RoleNames { get; set; } |
|
|
|
} |