Browse Source

Add distributed event handling for OpenIddict app changes

pull/24515/head
maliming 1 month ago
parent
commit
5e4228b994
No known key found for this signature in database GPG Key ID: A646B9CB645ECEA4
  1. 13
      modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Applications/OpenIddictApplicationClientIdChangedEto.cs
  2. 43
      modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Applications/OpenIddictApplicationEto.cs
  3. 13
      modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/AbpOpenIddictDomainMappers.cs
  4. 11
      modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/AbpOpenIddictDomainModule.cs
  5. 28
      modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Applications/AbpApplicationManager.cs
  6. 1
      modules/openiddict/src/Volo.Abp.PermissionManagement.Domain.OpenIddict/Volo/Abp/PermissionManagement/OpenIddict/ApplicationResourcePermissionProviderKeyLookupService.cs
  7. 45
      modules/openiddict/src/Volo.Abp.PermissionManagement.Domain.OpenIddict/Volo/Abp/PermissionManagement/OpenIddict/OpenIddictApplicationClientIdChangedHandler.cs
  8. 31
      modules/openiddict/src/Volo.Abp.PermissionManagement.Domain.OpenIddict/Volo/Abp/PermissionManagement/OpenIddict/OpenIddictApplicationDeletedEventHandler.cs

13
modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Applications/OpenIddictApplicationClientIdChangedEto.cs

@ -0,0 +1,13 @@
using System;
namespace Volo.Abp.OpenIddict.Applications;
[Serializable]
public class OpenIddictApplicationClientIdChangedEto
{
public Guid Id { get; set; }
public string ClientId { get; set; }
public string OldClientId { get; set; }
}

43
modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Applications/OpenIddictApplicationEto.cs

@ -0,0 +1,43 @@
using System;
namespace Volo.Abp.OpenIddict.Applications;
[Serializable]
public class OpenIddictApplicationEto
{
public Guid Id { get; set; }
public string ApplicationType { get; set; }
public string ClientId { get; set; }
public string ClientSecret { get; set; }
public string ClientType { get; set; }
public string ConsentType { get; set; }
public string DisplayName { get; set; }
public string DisplayNames { get; set; }
public string JsonWebKeySet { get; set; }
public string Permissions { get; set; }
public string PostLogoutRedirectUris { get; set; }
public string Properties { get; set; }
public string RedirectUris { get; set; }
public string Requirements { get; set; }
public string Settings { get; set; }
public string FrontChannelLogoutUri { get; set; }
public string ClientUri { get; set; }
public string LogoUri { get; set; }
}

13
modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/AbpOpenIddictDomainMappers.cs

@ -0,0 +1,13 @@
using Riok.Mapperly.Abstractions;
using Volo.Abp.Mapperly;
using Volo.Abp.OpenIddict.Applications;
namespace Volo.Abp.OpenIddict;
[Mapper(RequiredMappingStrategy = RequiredMappingStrategy.Target)]
public partial class OpenIddictApplicationToOpenIddictApplicationEtoMapper : MapperBase<OpenIddictApplication, OpenIddictApplicationEto>
{
public override partial OpenIddictApplicationEto Map(OpenIddictApplication source);
public override partial void Map(OpenIddictApplication source, OpenIddictApplicationEto destination);
}

11
modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/AbpOpenIddictDomainModule.cs

@ -8,6 +8,7 @@ using Volo.Abp.BackgroundWorkers;
using Volo.Abp.Caching;
using Volo.Abp.DistributedLocking;
using Volo.Abp.Domain;
using Volo.Abp.Domain.Entities.Events.Distributed;
using Volo.Abp.Guids;
using Volo.Abp.Identity;
using Volo.Abp.Modularity;
@ -18,6 +19,7 @@ using Volo.Abp.OpenIddict.Authorizations;
using Volo.Abp.OpenIddict.Scopes;
using Volo.Abp.OpenIddict.Tokens;
using Volo.Abp.Threading;
using Volo.Abp.Users;
namespace Volo.Abp.OpenIddict;
@ -36,6 +38,15 @@ public class AbpOpenIddictDomainModule : AbpModule
public override void ConfigureServices(ServiceConfigurationContext context)
{
AddOpenIddictCore(context.Services);
context.Services.AddMapperlyObjectMapper<AbpOpenIddictDomainModule>();
Configure<AbpDistributedEntityEventOptions>(options =>
{
options.EtoMappings.Add<OpenIddictApplication, OpenIddictApplicationEto>(typeof(AbpOpenIddictDomainModule));
options.AutoEventSelectors.Add<OpenIddictApplication>();
});
}
public override void OnApplicationInitialization(ApplicationInitializationContext context)

28
modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Applications/AbpApplicationManager.cs

@ -6,29 +6,35 @@ using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using OpenIddict.Abstractions;
using OpenIddict.Core;
using Volo.Abp.EventBus.Distributed;
namespace Volo.Abp.OpenIddict.Applications;
public class AbpApplicationManager : OpenIddictApplicationManager<OpenIddictApplicationModel>, IAbpApplicationManager
{
protected AbpOpenIddictIdentifierConverter IdentifierConverter { get; }
protected IDistributedEventBus DistributedEventBus { get; }
public AbpApplicationManager(
[NotNull] IOpenIddictApplicationCache<OpenIddictApplicationModel> cache,
[NotNull] ILogger<AbpApplicationManager> logger,
[NotNull] IOptionsMonitor<OpenIddictCoreOptions> options,
[NotNull] IOpenIddictApplicationStore<OpenIddictApplicationModel> resolver,
AbpOpenIddictIdentifierConverter identifierConverter)
AbpOpenIddictIdentifierConverter identifierConverter,
IDistributedEventBus distributedEventBus)
: base(cache, logger, options, resolver)
{
IdentifierConverter = identifierConverter;
DistributedEventBus = distributedEventBus;
}
public async override ValueTask UpdateAsync(OpenIddictApplicationModel application, CancellationToken cancellationToken = default)
public override async ValueTask UpdateAsync(OpenIddictApplicationModel application, CancellationToken cancellationToken = default)
{
var entity = await Store.FindByIdAsync(IdentifierConverter.ToString(application.Id), cancellationToken);
var oldClientId = entity?.ClientId;
if (!Options.CurrentValue.DisableEntityCaching)
{
var entity = await Store.FindByIdAsync(IdentifierConverter.ToString(application.Id), cancellationToken);
if (entity != null)
{
await Cache.RemoveAsync(entity, cancellationToken);
@ -36,9 +42,21 @@ public class AbpApplicationManager : OpenIddictApplicationManager<OpenIddictAppl
}
await base.UpdateAsync(application, cancellationToken);
if (oldClientId != null &&
application.ClientId != null &&
oldClientId != application.ClientId)
{
await DistributedEventBus.PublishAsync(new OpenIddictApplicationClientIdChangedEto
{
Id = application.Id,
OldClientId = oldClientId,
ClientId = application.ClientId
});
}
}
public async override ValueTask PopulateAsync(OpenIddictApplicationDescriptor descriptor, OpenIddictApplicationModel application, CancellationToken cancellationToken = default)
public override async ValueTask PopulateAsync(OpenIddictApplicationDescriptor descriptor, OpenIddictApplicationModel application, CancellationToken cancellationToken = default)
{
await base.PopulateAsync(descriptor, application, cancellationToken);
@ -60,7 +78,7 @@ public class AbpApplicationManager : OpenIddictApplicationManager<OpenIddictAppl
}
}
public async override ValueTask PopulateAsync(OpenIddictApplicationModel application, OpenIddictApplicationDescriptor descriptor, CancellationToken cancellationToken = default)
public override async ValueTask PopulateAsync(OpenIddictApplicationModel application, OpenIddictApplicationDescriptor descriptor, CancellationToken cancellationToken = default)
{
await base.PopulateAsync(application, descriptor, cancellationToken);

1
modules/openiddict/src/Volo.Abp.PermissionManagement.Domain.OpenIddict/Volo/Abp/PermissionManagement/OpenIddict/ApplicationResourcePermissionProviderKeyLookupService.cs

@ -3,7 +3,6 @@ using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using OpenIddict.Abstractions;
using Volo.Abp.Authorization.Permissions.Resources;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Localization;

45
modules/openiddict/src/Volo.Abp.PermissionManagement.Domain.OpenIddict/Volo/Abp/PermissionManagement/OpenIddict/OpenIddictApplicationClientIdChangedHandler.cs

@ -0,0 +1,45 @@
using System.Threading.Tasks;
using Volo.Abp.Authorization.Permissions;
using Volo.Abp.Authorization.Permissions.Resources;
using Volo.Abp.DependencyInjection;
using Volo.Abp.EventBus.Distributed;
using Volo.Abp.OpenIddict.Applications;
namespace Volo.Abp.PermissionManagement.OpenIddict;
public class OpenIddictApplicationClientIdChangedHandler :
IDistributedEventHandler<OpenIddictApplicationClientIdChangedEto>,
ITransientDependency
{
protected IPermissionManager PermissionManager { get; }
protected IPermissionGrantRepository PermissionGrantRepository { get; }
protected IResourcePermissionManager ResourcePermissionManager { get; }
protected IResourcePermissionGrantRepository ResourcePermissionGrantRepository { get; }
public OpenIddictApplicationClientIdChangedHandler(
IPermissionManager permissionManager,
IPermissionGrantRepository permissionGrantRepository,
IResourcePermissionManager resourcePermissionManager,
IResourcePermissionGrantRepository resourcePermissionGrantRepository)
{
PermissionManager = permissionManager;
PermissionGrantRepository = permissionGrantRepository;
ResourcePermissionManager = resourcePermissionManager;
ResourcePermissionGrantRepository = resourcePermissionGrantRepository;
}
public async Task HandleEventAsync(OpenIddictApplicationClientIdChangedEto eventData)
{
var permissionGrantsInRole = await PermissionGrantRepository.GetListAsync(ClientPermissionValueProvider.ProviderName, eventData.OldClientId);
foreach (var permissionGrant in permissionGrantsInRole)
{
await PermissionManager.UpdateProviderKeyAsync(permissionGrant, eventData.ClientId);
}
var resourcePermissionGrantsInRole = await ResourcePermissionGrantRepository.GetListAsync(ClientResourcePermissionValueProvider.ProviderName, eventData.OldClientId);
foreach (var resourcePermissionGrant in resourcePermissionGrantsInRole)
{
await ResourcePermissionManager.UpdateProviderKeyAsync(resourcePermissionGrant, eventData.ClientId);
}
}
}

31
modules/openiddict/src/Volo.Abp.PermissionManagement.Domain.OpenIddict/Volo/Abp/PermissionManagement/OpenIddict/OpenIddictApplicationDeletedEventHandler.cs

@ -0,0 +1,31 @@
using System.Threading.Tasks;
using Volo.Abp.Authorization.Permissions;
using Volo.Abp.Authorization.Permissions.Resources;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Domain.Entities.Events.Distributed;
using Volo.Abp.EventBus.Distributed;
using Volo.Abp.OpenIddict.Applications;
using Volo.Abp.Uow;
namespace Volo.Abp.PermissionManagement.OpenIddict;
public class OpenIddictApplicationDeletedEventHandler :
IDistributedEventHandler<EntityDeletedEto<OpenIddictApplicationEto>>,
ITransientDependency
{
protected IPermissionManager PermissionManager { get; }
protected IResourcePermissionManager ResourcePermissionManager { get; }
public OpenIddictApplicationDeletedEventHandler(IPermissionManager permissionManager, IResourcePermissionManager resourcePermissionManager)
{
PermissionManager = permissionManager;
ResourcePermissionManager = resourcePermissionManager;
}
[UnitOfWork]
public virtual async Task HandleEventAsync(EntityDeletedEto<OpenIddictApplicationEto> eventData)
{
await PermissionManager.DeleteAsync(ClientPermissionValueProvider.ProviderName, eventData.Entity.ClientId);
await ResourcePermissionManager.DeleteAsync(ClientResourcePermissionValueProvider.ProviderName, eventData.Entity.ClientId);
}
}
Loading…
Cancel
Save