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