diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/AbpOpenIddictDomainModule.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/AbpOpenIddictDomainModule.cs index 428f5a7062..c9ec33780e 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/AbpOpenIddictDomainModule.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/AbpOpenIddictDomainModule.cs @@ -71,6 +71,9 @@ public class AbpOpenIddictDomainModule : AbpModule .AddTokenStore(); builder.ReplaceApplicationManager(typeof(AbpApplicationManager)); + builder.ReplaceAuthorizationManager(typeof(AbpAuthorizationManager)); + builder.ReplaceScopeManager(typeof(AbpScopeManager)); + builder.ReplaceTokenManager(typeof(AbpTokenManager)); builder.Services.TryAddScoped(provider => (IAbpApplicationManager)provider.GetRequiredService()); diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/AbpOpenIddictIdentifierConverter.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/AbpOpenIddictIdentifierConverter.cs new file mode 100644 index 0000000000..3d55a89ad8 --- /dev/null +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/AbpOpenIddictIdentifierConverter.cs @@ -0,0 +1,17 @@ +using System; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.OpenIddict; + +public class AbpOpenIddictIdentifierConverter : ITransientDependency +{ + public virtual Guid FromString(string identifier) + { + return string.IsNullOrEmpty(identifier) ? default : Guid.Parse(identifier); + } + + public virtual string ToString(Guid identifier) + { + return identifier.ToString("D"); + } +} diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/AbpOpenIddictStoreBase.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/AbpOpenIddictStoreBase.cs index 4c90c3a083..29254b8a00 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/AbpOpenIddictStoreBase.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/AbpOpenIddictStoreBase.cs @@ -20,26 +20,28 @@ public abstract class AbpOpenIddictStoreBase protected TRepository Repository { get; } protected IUnitOfWorkManager UnitOfWorkManager { get; } protected IGuidGenerator GuidGenerator { get; } + protected AbpOpenIddictIdentifierConverter IdentifierConverter { get; } - protected AbpOpenIddictStoreBase(TRepository repository, IUnitOfWorkManager unitOfWorkManager, IGuidGenerator guidGenerator) + protected AbpOpenIddictStoreBase(TRepository repository, IUnitOfWorkManager unitOfWorkManager, IGuidGenerator guidGenerator, AbpOpenIddictIdentifierConverter identifierConverter) { Repository = repository; UnitOfWorkManager = unitOfWorkManager; GuidGenerator = guidGenerator; + IdentifierConverter = identifierConverter; Logger = NullLogger>.Instance; } protected virtual Guid ConvertIdentifierFromString(string identifier) { - return string.IsNullOrEmpty(identifier) ? default : Guid.Parse(identifier); + return IdentifierConverter.FromString(identifier); } protected virtual string ConvertIdentifierToString(Guid identifier) { - return identifier.ToString("D"); + return IdentifierConverter.ToString(identifier); } - + protected virtual string WriteStream(Action action) { using (var stream = new MemoryStream()) diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Applications/AbpApplicationManager.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Applications/AbpApplicationManager.cs index b205f60be2..5b90574e59 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Applications/AbpApplicationManager.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Applications/AbpApplicationManager.cs @@ -11,14 +11,31 @@ namespace Volo.Abp.OpenIddict.Applications; public class AbpApplicationManager : OpenIddictApplicationManager, IAbpApplicationManager { + protected AbpOpenIddictIdentifierConverter IdentifierConverter { get; } + public AbpApplicationManager( [NotNull] IOpenIddictApplicationCache cache, [NotNull] ILogger logger, [NotNull] IOptionsMonitor options, - [NotNull] IOpenIddictApplicationStoreResolver resolver) + [NotNull] IOpenIddictApplicationStoreResolver resolver, + AbpOpenIddictIdentifierConverter identifierConverter) : base(cache, logger, options, resolver) { + IdentifierConverter = identifierConverter; + } + + public async override ValueTask UpdateAsync(OpenIddictApplicationModel application, CancellationToken cancellationToken = default) + { + if (!Options.CurrentValue.DisableEntityCaching) + { + var entity = await Store.FindByIdAsync(IdentifierConverter.ToString(application.Id), cancellationToken); + if (entity != null) + { + await Cache.RemoveAsync(entity, cancellationToken); + } + } + await base.UpdateAsync(application, cancellationToken); } public async override ValueTask PopulateAsync(OpenIddictApplicationDescriptor descriptor, OpenIddictApplicationModel application, CancellationToken cancellationToken = default) diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Applications/AbpOpenIddictApplicationCache.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Applications/AbpOpenIddictApplicationCache.cs index 2a1e49f4f7..877109e26c 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Applications/AbpOpenIddictApplicationCache.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Applications/AbpOpenIddictApplicationCache.cs @@ -34,13 +34,13 @@ public class AbpOpenIddictApplicationCache : AbpOpenIddictCacheBase FindByClientIdAsync(string identifier, CancellationToken cancellationToken) + public virtual async ValueTask FindByClientIdAsync(string clientId, CancellationToken cancellationToken) { - Check.NotNullOrEmpty(identifier, nameof(identifier)); + Check.NotNullOrEmpty(clientId, nameof(clientId)); - return await Cache.GetOrAddAsync($"{nameof(FindByClientIdAsync)}_{identifier}", async () => + return await Cache.GetOrAddAsync($"{nameof(FindByClientIdAsync)}_{clientId}", async () => { - var application = await Store.FindByClientIdAsync(identifier, cancellationToken); + var application = await Store.FindByClientIdAsync(clientId, cancellationToken); if (application != null) { await AddAsync(application, cancellationToken); @@ -49,13 +49,13 @@ public class AbpOpenIddictApplicationCache : AbpOpenIddictCacheBase FindByIdAsync(string identifier, CancellationToken cancellationToken) + public virtual async ValueTask FindByIdAsync(string id, CancellationToken cancellationToken) { - Check.NotNullOrEmpty(identifier, nameof(identifier)); + Check.NotNullOrEmpty(id, nameof(id)); - return await Cache.GetOrAddAsync($"{nameof(FindByIdAsync)}_{identifier}", async () => + return await Cache.GetOrAddAsync($"{nameof(FindByIdAsync)}_{id}", async () => { - var application = await Store.FindByIdAsync(identifier, cancellationToken); + var application = await Store.FindByIdAsync(id, cancellationToken); if (application != null) { await AddAsync(application, cancellationToken); diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Applications/AbpOpenIddictApplicationStore.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Applications/AbpOpenIddictApplicationStore.cs index eb0c4033f9..02d911a4b2 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Applications/AbpOpenIddictApplicationStore.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Applications/AbpOpenIddictApplicationStore.cs @@ -22,8 +22,9 @@ public class AbpOpenIddictApplicationStore : AbpOpenIddictStoreBase +{ + protected AbpOpenIddictIdentifierConverter IdentifierConverter { get; } + + public AbpAuthorizationManager( + [NotNull] [ItemNotNull] IOpenIddictAuthorizationCache cache, + [NotNull] [ItemNotNull] ILogger> logger, + [NotNull] [ItemNotNull] IOptionsMonitor options, + [NotNull] IOpenIddictAuthorizationStoreResolver resolver, + AbpOpenIddictIdentifierConverter identifierConverter) + : base(cache, logger, options, resolver) + { + IdentifierConverter = identifierConverter; + } + + public async override ValueTask UpdateAsync(OpenIddictAuthorizationModel authorization, CancellationToken cancellationToken = default) + { + if (!Options.CurrentValue.DisableEntityCaching) + { + var entity = await Store.FindByIdAsync(IdentifierConverter.ToString(authorization.Id), cancellationToken); + if (entity != null) + { + await Cache.RemoveAsync(entity, cancellationToken); + } + } + + await base.UpdateAsync(authorization, cancellationToken); + } +} diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Authorizations/AbpOpenIddictAuthorizationCache.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Authorizations/AbpOpenIddictAuthorizationCache.cs index 9079a57acc..95c1a59526 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Authorizations/AbpOpenIddictAuthorizationCache.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Authorizations/AbpOpenIddictAuthorizationCache.cs @@ -114,14 +114,14 @@ public class AbpOpenIddictAuthorizationCache : AbpOpenIddictCacheBase FindByApplicationIdAsync(string identifier, [EnumeratorCancellation] CancellationToken cancellationToken) + public async IAsyncEnumerable FindByApplicationIdAsync(string applicationId, [EnumeratorCancellation] CancellationToken cancellationToken) { - Check.NotNullOrEmpty(identifier, nameof(identifier)); + Check.NotNullOrEmpty(applicationId, nameof(applicationId)); - var authorizations = await ArrayCache.GetOrAddAsync($"{nameof(FindByApplicationIdAsync)}_{identifier}", async () => + var authorizations = await ArrayCache.GetOrAddAsync($"{nameof(FindByApplicationIdAsync)}_{applicationId}", async () => { var applications = new List(); - await foreach (var authorization in Store.FindByApplicationIdAsync(identifier, cancellationToken)) + await foreach (var authorization in Store.FindByApplicationIdAsync(applicationId, cancellationToken)) { applications.Add(authorization); await AddAsync(authorization, cancellationToken); @@ -135,12 +135,12 @@ public class AbpOpenIddictAuthorizationCache : AbpOpenIddictCacheBase FindByIdAsync(string identifier, CancellationToken cancellationToken) + public async ValueTask FindByIdAsync(string id, CancellationToken cancellationToken) { - Check.NotNullOrEmpty(identifier, nameof(identifier)); + Check.NotNullOrEmpty(id, nameof(id)); - return await Cache.GetOrAddAsync($"{nameof(FindByIdAsync)}_{identifier}", - async () => await Store.FindByIdAsync(identifier, cancellationToken), token: cancellationToken); + return await Cache.GetOrAddAsync($"{nameof(FindByIdAsync)}_{id}", + async () => await Store.FindByIdAsync(id, cancellationToken), token: cancellationToken); } public async IAsyncEnumerable FindBySubjectAsync(string subject, [EnumeratorCancellation] CancellationToken cancellationToken) diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Authorizations/AbpOpenIddictAuthorizationStore.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Authorizations/AbpOpenIddictAuthorizationStore.cs index 6e6582e047..1637288125 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Authorizations/AbpOpenIddictAuthorizationStore.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Authorizations/AbpOpenIddictAuthorizationStore.cs @@ -25,8 +25,9 @@ public class AbpOpenIddictAuthorizationStore : AbpOpenIddictStoreBase FindByIdAsync(string identifier, CancellationToken cancellationToken) + public virtual async ValueTask FindByIdAsync(string id, CancellationToken cancellationToken) { - Check.NotNullOrEmpty(identifier, nameof(identifier)); + Check.NotNullOrEmpty(id, nameof(id)); - return await Cache.GetOrAddAsync($"{nameof(FindByIdAsync)}_{identifier}", async () => + return await Cache.GetOrAddAsync($"{nameof(FindByIdAsync)}_{id}", async () => { - var scope = await Store.FindByIdAsync(identifier, cancellationToken); + var scope = await Store.FindByIdAsync(id, cancellationToken); if (scope != null) { await AddAsync(scope, cancellationToken); diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Scopes/AbpOpenIddictScopeStore.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Scopes/AbpOpenIddictScopeStore.cs index aedfe83c26..d10065e1dd 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Scopes/AbpOpenIddictScopeStore.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Scopes/AbpOpenIddictScopeStore.cs @@ -18,8 +18,9 @@ public class AbpOpenIddictScopeStore : AbpOpenIddictStoreBase +{ + protected AbpOpenIddictIdentifierConverter IdentifierConverter { get; } + + public AbpScopeManager( + [NotNull] [ItemNotNull] IOpenIddictScopeCache cache, + [NotNull] [ItemNotNull] ILogger> logger, + [NotNull] [ItemNotNull] IOptionsMonitor options, + [NotNull] IOpenIddictScopeStoreResolver resolver, + AbpOpenIddictIdentifierConverter identifierConverter) + : base(cache, logger, options, resolver) + { + IdentifierConverter = identifierConverter; + } + + public async override ValueTask UpdateAsync(OpenIddictScopeModel scope, CancellationToken cancellationToken = default) + { + if (!Options.CurrentValue.DisableEntityCaching) + { + var entity = await Store.FindByIdAsync(IdentifierConverter.ToString(scope.Id), cancellationToken); + if (entity != null) + { + await Cache.RemoveAsync(entity, cancellationToken); + } + } + + await base.UpdateAsync(scope, cancellationToken); + } +} diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Tokens/AbpOpenIddictTokenStore.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Tokens/AbpOpenIddictTokenStore.cs index c8b80831a9..29b07d032d 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Tokens/AbpOpenIddictTokenStore.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Tokens/AbpOpenIddictTokenStore.cs @@ -25,8 +25,9 @@ public class AbpOpenIddictTokenStore : AbpOpenIddictStoreBase +{ + protected AbpOpenIddictIdentifierConverter IdentifierConverter { get; } + + public AbpTokenManager( + [NotNull] [ItemNotNull] IOpenIddictTokenCache cache, + [NotNull] [ItemNotNull] ILogger> logger, + [NotNull] [ItemNotNull] IOptionsMonitor options, + [NotNull] IOpenIddictTokenStoreResolver resolver, + AbpOpenIddictIdentifierConverter identifierConverter) + : base(cache, logger, options, resolver) + { + IdentifierConverter = identifierConverter; + } + + public async override ValueTask UpdateAsync(OpenIddictTokenModel token, CancellationToken cancellationToken = default) + { + if (!Options.CurrentValue.DisableEntityCaching) + { + var entity = await Store.FindByIdAsync(IdentifierConverter.ToString(token.Id), cancellationToken); + if (entity != null) + { + await Cache.RemoveAsync(entity, cancellationToken); + } + } + + await base.UpdateAsync(token, cancellationToken); + } +}