8 changed files with 306 additions and 4 deletions
@ -0,0 +1,60 @@ |
|||||
|
using System; |
||||
|
using System.Linq; |
||||
|
using System.Threading.Tasks; |
||||
|
using Keycloak.Net; |
||||
|
using Microsoft.Extensions.Logging; |
||||
|
using Microsoft.Extensions.Options; |
||||
|
using Volo.Abp; |
||||
|
using Volo.Abp.BackgroundJobs; |
||||
|
using Volo.Abp.DependencyInjection; |
||||
|
|
||||
|
namespace EShopOnAbp.IdentityService.BackgroundJobs; |
||||
|
|
||||
|
public class IdentityUserDeletionJob : AsyncBackgroundJob<IdentityUserDeletionArgs>, ITransientDependency |
||||
|
{ |
||||
|
private readonly KeycloakClient _keycloakClient; |
||||
|
private readonly KeycloakClientOptions _keycloakOptions; |
||||
|
private readonly ILogger<KeycloakUserCreationJob> _logger; |
||||
|
|
||||
|
public IdentityUserDeletionJob(IOptions<KeycloakClientOptions> keycloakOptions, |
||||
|
ILogger<KeycloakUserCreationJob> logger) |
||||
|
{ |
||||
|
_logger = logger; |
||||
|
_keycloakOptions = keycloakOptions.Value; |
||||
|
|
||||
|
_keycloakClient = new KeycloakClient( |
||||
|
_keycloakOptions.Url, |
||||
|
_keycloakOptions.AdminUserName, |
||||
|
_keycloakOptions.AdminPassword |
||||
|
); |
||||
|
} |
||||
|
|
||||
|
public override async Task ExecuteAsync(IdentityUserDeletionArgs args) |
||||
|
{ |
||||
|
try |
||||
|
{ |
||||
|
var keycloakUser = (await _keycloakClient.GetUsersAsync(_keycloakOptions.RealmName, username: args.UserName)) |
||||
|
.First(); |
||||
|
if (keycloakUser == null) |
||||
|
{ |
||||
|
_logger.LogError($"Keycloak user could not be found to delete! Username:{args.UserName}"); |
||||
|
throw new UserFriendlyException($"Keycloak user with the username:{args.UserName} could not be found!"); |
||||
|
} |
||||
|
|
||||
|
var result = await _keycloakClient.DeleteUserAsync(_keycloakOptions.RealmName, keycloakUser.Id); |
||||
|
if (result) |
||||
|
{ |
||||
|
_logger.LogInformation($"Keycloak user with the username:{args.UserName} has been deleted."); |
||||
|
} |
||||
|
} |
||||
|
catch (Exception e) |
||||
|
{ |
||||
|
_logger.LogError($"Keycloak user deletion failed! Username:{args.UserName}"); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public class IdentityUserDeletionArgs |
||||
|
{ |
||||
|
public string UserName { get; set; } |
||||
|
} |
||||
@ -0,0 +1,9 @@ |
|||||
|
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; } |
||||
|
} |
||||
@ -0,0 +1,70 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Threading.Tasks; |
||||
|
using Keycloak.Net; |
||||
|
using Keycloak.Net.Models.Users; |
||||
|
using Microsoft.Extensions.Logging; |
||||
|
using Microsoft.Extensions.Options; |
||||
|
using Volo.Abp.BackgroundJobs; |
||||
|
using Volo.Abp.DependencyInjection; |
||||
|
|
||||
|
namespace EShopOnAbp.IdentityService.BackgroundJobs; |
||||
|
|
||||
|
public class KeycloakUserCreationJob : AsyncBackgroundJob<IdentityUserCreationArgs>, ITransientDependency |
||||
|
{ |
||||
|
private readonly KeycloakClient _keycloakClient; |
||||
|
private readonly KeycloakClientOptions _keycloakOptions; |
||||
|
private readonly ILogger<KeycloakUserCreationJob> _logger; |
||||
|
|
||||
|
public KeycloakUserCreationJob(IOptions<KeycloakClientOptions> keycloakOptions, |
||||
|
ILogger<KeycloakUserCreationJob> logger) |
||||
|
{ |
||||
|
_logger = logger; |
||||
|
_keycloakOptions = keycloakOptions.Value; |
||||
|
|
||||
|
_keycloakClient = new KeycloakClient( |
||||
|
_keycloakOptions.Url, |
||||
|
_keycloakOptions.AdminUserName, |
||||
|
_keycloakOptions.AdminPassword |
||||
|
); |
||||
|
} |
||||
|
|
||||
|
public override async Task ExecuteAsync(IdentityUserCreationArgs args) |
||||
|
{ |
||||
|
var keycloakUser = new User |
||||
|
{ |
||||
|
Email = args.Email, |
||||
|
UserName = args.UserName, |
||||
|
FirstName = args.Name, |
||||
|
LastName = args.Surname, |
||||
|
Enabled = true, |
||||
|
Credentials = new List<Credentials>() |
||||
|
{ |
||||
|
new() { Type = "password", Value = args.Password } |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
try |
||||
|
{ |
||||
|
var result = await _keycloakClient.CreateUserAsync(_keycloakOptions.RealmName, keycloakUser); |
||||
|
if (result) |
||||
|
{ |
||||
|
_logger.LogInformation($"Keycloak user with the username:{args.UserName} has been created."); |
||||
|
} |
||||
|
} |
||||
|
catch (Exception e) |
||||
|
{ |
||||
|
_logger.LogError($"Keycloak user creation with the Username:{args.UserName} has been failed!"); |
||||
|
throw; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public class IdentityUserCreationArgs |
||||
|
{ |
||||
|
public string Email { get; set; } |
||||
|
public string UserName { get; set; } |
||||
|
public string Name { get; set; } |
||||
|
public string Surname { get; set; } |
||||
|
public string Password { get; set; } |
||||
|
} |
||||
@ -0,0 +1,70 @@ |
|||||
|
using System; |
||||
|
using System.Linq; |
||||
|
using System.Threading.Tasks; |
||||
|
using Keycloak.Net; |
||||
|
using Keycloak.Net.Models.Users; |
||||
|
using Microsoft.Extensions.Logging; |
||||
|
using Microsoft.Extensions.Options; |
||||
|
using Volo.Abp; |
||||
|
using Volo.Abp.BackgroundJobs; |
||||
|
using Volo.Abp.DependencyInjection; |
||||
|
|
||||
|
namespace EShopOnAbp.IdentityService.BackgroundJobs; |
||||
|
|
||||
|
public class KeycloakUserUpdatingJob : AsyncBackgroundJob<IdentityUserUpdatingArgs>, ITransientDependency |
||||
|
{ |
||||
|
private readonly KeycloakClient _keycloakClient; |
||||
|
private readonly KeycloakClientOptions _keycloakOptions; |
||||
|
private readonly ILogger<KeycloakUserCreationJob> _logger; |
||||
|
|
||||
|
public KeycloakUserUpdatingJob(IOptions<KeycloakClientOptions> keycloakOptions, ILogger<KeycloakUserCreationJob> logger) |
||||
|
{ |
||||
|
_logger = logger; |
||||
|
_keycloakOptions = keycloakOptions.Value; |
||||
|
|
||||
|
_keycloakClient = new KeycloakClient( |
||||
|
_keycloakOptions.Url, |
||||
|
_keycloakOptions.AdminUserName, |
||||
|
_keycloakOptions.AdminPassword |
||||
|
); |
||||
|
} |
||||
|
|
||||
|
public override async Task ExecuteAsync(IdentityUserUpdatingArgs args) |
||||
|
{ |
||||
|
try |
||||
|
{ |
||||
|
var keycloakUser = (await _keycloakClient.GetUsersAsync(_keycloakOptions.RealmName, username: args.UserName)) |
||||
|
.First(); |
||||
|
if (keycloakUser == null) |
||||
|
{ |
||||
|
_logger.LogError($"Keycloak user could not be found to update! Username:{args.UserName}"); |
||||
|
throw new UserFriendlyException($"Keycloak user with the username:{args.UserName} could not be found!"); |
||||
|
} |
||||
|
|
||||
|
keycloakUser.UserName = args.UserName; |
||||
|
keycloakUser.Email = args.Email; |
||||
|
keycloakUser.FirstName = args.Name; |
||||
|
keycloakUser.LastName = args.Surname; |
||||
|
keycloakUser.EmailVerified = args.EmailConfirmed; |
||||
|
|
||||
|
var result = await _keycloakClient.UpdateUserAsync(_keycloakOptions.RealmName, keycloakUser.Id, keycloakUser); |
||||
|
if (result) |
||||
|
{ |
||||
|
_logger.LogInformation($"Keycloak user with the username:{args.UserName} has been updated."); |
||||
|
} |
||||
|
} |
||||
|
catch (Exception e) |
||||
|
{ |
||||
|
_logger.LogError($"Keycloak user updating failed! Username:{args.UserName}"); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public class IdentityUserUpdatingArgs |
||||
|
{ |
||||
|
public string Email { get; set; } |
||||
|
public string UserName { get; set; } |
||||
|
public string Name { get; set; } |
||||
|
public string Surname { get; set; } |
||||
|
public bool EmailConfirmed { get; set; } |
||||
|
} |
||||
@ -0,0 +1,71 @@ |
|||||
|
using System; |
||||
|
using System.Threading.Tasks; |
||||
|
using EShopOnAbp.IdentityService.BackgroundJobs; |
||||
|
using Microsoft.AspNetCore.Identity; |
||||
|
using Microsoft.Extensions.Options; |
||||
|
using Volo.Abp.BackgroundJobs; |
||||
|
using Volo.Abp.DependencyInjection; |
||||
|
using Volo.Abp.Identity; |
||||
|
|
||||
|
namespace EShopOnAbp.IdentityService; |
||||
|
|
||||
|
[ExposeServices(typeof(IdentityUserAppService), typeof(IIdentityUserAppService))] |
||||
|
public class EShopIdentityUserAppService : IdentityUserAppService |
||||
|
{ |
||||
|
private readonly IBackgroundJobManager _backgroundJobManager; |
||||
|
private readonly IIdentityUserRepository _userRepository; |
||||
|
|
||||
|
public EShopIdentityUserAppService( |
||||
|
IdentityUserManager userManager, |
||||
|
IIdentityUserRepository userRepository, |
||||
|
IIdentityRoleRepository roleRepository, |
||||
|
IOptions<IdentityOptions> identityOptions, IBackgroundJobManager backgroundJobManager) : base(userManager, |
||||
|
userRepository, |
||||
|
roleRepository, |
||||
|
identityOptions) |
||||
|
{ |
||||
|
_backgroundJobManager = backgroundJobManager; |
||||
|
_userRepository = userRepository; |
||||
|
} |
||||
|
|
||||
|
public override async Task<IdentityUserDto> CreateAsync(IdentityUserCreateDto input) |
||||
|
{ |
||||
|
var createdUser = await base.CreateAsync(input); |
||||
|
await _backgroundJobManager.EnqueueAsync(new IdentityUserCreationArgs |
||||
|
{ |
||||
|
Email = createdUser.Email, |
||||
|
UserName = createdUser.UserName, |
||||
|
Name = createdUser.Name, |
||||
|
Surname = createdUser.Surname, |
||||
|
Password = input.Password |
||||
|
}); |
||||
|
|
||||
|
return createdUser; |
||||
|
} |
||||
|
|
||||
|
public override async Task<IdentityUserDto> UpdateAsync(Guid id, IdentityUserUpdateDto input) |
||||
|
{ |
||||
|
var updatedUser = await base.UpdateAsync(id, input); |
||||
|
await _backgroundJobManager.EnqueueAsync(new IdentityUserUpdatingArgs |
||||
|
{ |
||||
|
Email = updatedUser.Email, |
||||
|
UserName = updatedUser.UserName, |
||||
|
Name = updatedUser.Name, |
||||
|
Surname = updatedUser.Surname, |
||||
|
EmailConfirmed = updatedUser.EmailConfirmed |
||||
|
}); |
||||
|
|
||||
|
return updatedUser; |
||||
|
} |
||||
|
|
||||
|
public override async Task DeleteAsync(Guid id) |
||||
|
{ |
||||
|
var user = await _userRepository.FindAsync(id); |
||||
|
await base.DeleteAsync(id); |
||||
|
|
||||
|
await _backgroundJobManager.EnqueueAsync(new IdentityUserDeletionArgs |
||||
|
{ |
||||
|
UserName = user.UserName |
||||
|
}); |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue