From 733ff1d8133c0268d9b171d5d7dc0c08b2fbf6ba Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 26 Feb 2024 17:11:43 +0800 Subject: [PATCH 1/4] Add `AbpOpenIddictStoreOptions` to configure the `IsolationLevel`. The following isolation levels are supported by Oracle: `IsolationLevel.ReadCommitted and IsolationLevel.Serializable.` --- .../Volo/Abp/OpenIddict/AbpOpenIddictStoreBase.cs | 5 ++++- .../Abp/OpenIddict/AbpOpenIddictStoreOptions.cs | 13 +++++++++++++ .../Applications/AbpOpenIddictApplicationStore.cs | 8 +++++--- .../AbpOpenIddictAuthorizationStore.cs | 10 ++++++---- .../OpenIddict/Scopes/AbpOpenIddictScopeStore.cs | 6 ++++-- .../OpenIddict/Tokens/AbpOpenIddictTokenStore.cs | 8 +++++--- 6 files changed, 37 insertions(+), 13 deletions(-) create mode 100644 modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/AbpOpenIddictStoreOptions.cs 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 784e07f7cf..469476bed4 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 @@ -6,6 +6,7 @@ using System.Text.Json; using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; +using Microsoft.Extensions.Options; using Volo.Abp.Domain.Repositories; using Volo.Abp.Guids; using Volo.Abp.Uow; @@ -22,14 +23,16 @@ public abstract class AbpOpenIddictStoreBase protected IGuidGenerator GuidGenerator { get; } protected AbpOpenIddictIdentifierConverter IdentifierConverter { get; } protected IOpenIddictDbConcurrencyExceptionHandler ConcurrencyExceptionHandler { get; } + protected IOptions StoreOptions { get; } - protected AbpOpenIddictStoreBase(TRepository repository, IUnitOfWorkManager unitOfWorkManager, IGuidGenerator guidGenerator, AbpOpenIddictIdentifierConverter identifierConverter, IOpenIddictDbConcurrencyExceptionHandler concurrencyExceptionHandler) + protected AbpOpenIddictStoreBase(TRepository repository, IUnitOfWorkManager unitOfWorkManager, IGuidGenerator guidGenerator, AbpOpenIddictIdentifierConverter identifierConverter, IOpenIddictDbConcurrencyExceptionHandler concurrencyExceptionHandler, IOptions storeOptions) { Repository = repository; UnitOfWorkManager = unitOfWorkManager; GuidGenerator = guidGenerator; IdentifierConverter = identifierConverter; ConcurrencyExceptionHandler = concurrencyExceptionHandler; + StoreOptions = storeOptions; Logger = NullLogger>.Instance; } diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/AbpOpenIddictStoreOptions.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/AbpOpenIddictStoreOptions.cs new file mode 100644 index 0000000000..5a4817a0f0 --- /dev/null +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/AbpOpenIddictStoreOptions.cs @@ -0,0 +1,13 @@ +using System.Data; + +namespace Volo.Abp.OpenIddict; + +public class AbpOpenIddictStoreOptions +{ + public IsolationLevel DefaultIsolationLevel { get; set; } + + public AbpOpenIddictStoreOptions() + { + DefaultIsolationLevel = IsolationLevel.RepeatableRead; + } +} 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 b5f2e03f8e..db75bfa665 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 @@ -9,6 +9,7 @@ using System.Text.Json; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; using Microsoft.IdentityModel.Tokens; using OpenIddict.Abstractions; using Volo.Abp.Data; @@ -28,8 +29,9 @@ public class AbpOpenIddictApplicationStore : AbpOpenIddictStoreBase storeOptions) + : base(repository, unitOfWorkManager, guidGenerator, identifierConverter, concurrencyExceptionHandler, storeOptions) { TokenRepository = tokenRepository; } @@ -59,7 +61,7 @@ public class AbpOpenIddictApplicationStore : AbpOpenIddictStoreBase storeOptions) + : base(repository, unitOfWorkManager, guidGenerator, identifierConverter, concurrencyExceptionHandler, storeOptions) { ApplicationRepository = applicationRepository; TokenRepository = tokenRepository; @@ -61,7 +63,7 @@ public class AbpOpenIddictAuthorizationStore : AbpOpenIddictStoreBase PruneAsync(DateTimeOffset threshold, CancellationToken cancellationToken) { - using (var uow = UnitOfWorkManager.Begin(requiresNew: true, isTransactional: true, isolationLevel: IsolationLevel.RepeatableRead)) + using (var uow = UnitOfWorkManager.Begin(requiresNew: true, isTransactional: true, isolationLevel: StoreOptions.Value.DefaultIsolationLevel)) { var date = threshold.UtcDateTime; var count = await Repository.PruneAsync(date, cancellationToken: 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 15354a6664..9d235c9137 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 @@ -8,6 +8,7 @@ using System.Text.Json; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; using OpenIddict.Abstractions; using Volo.Abp.Data; using Volo.Abp.Guids; @@ -22,8 +23,9 @@ public class AbpOpenIddictScopeStore : AbpOpenIddictStoreBase storeOptions) + : base(repository, unitOfWorkManager, guidGenerator, identifierConverter, concurrencyExceptionHandler, storeOptions) { } 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 b861da8407..e8bcfff58d 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 @@ -8,6 +8,7 @@ using System.Text.Json; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; using OpenIddict.Abstractions; using Volo.Abp.Data; using Volo.Abp.Guids; @@ -29,8 +30,9 @@ public class AbpOpenIddictTokenStore : AbpOpenIddictStoreBase storeOptions) + : base(repository, unitOfWorkManager, guidGenerator, identifierConverter, concurrencyExceptionHandler, storeOptions) { ApplicationRepository = applicationRepository; AuthorizationRepository = authorizationRepository; @@ -309,7 +311,7 @@ public class AbpOpenIddictTokenStore : AbpOpenIddictStoreBase PruneAsync(DateTimeOffset threshold, CancellationToken cancellationToken) { - using (var uow = UnitOfWorkManager.Begin(requiresNew: true, isTransactional: true, isolationLevel: IsolationLevel.RepeatableRead)) + using (var uow = UnitOfWorkManager.Begin(requiresNew: true, isTransactional: true, isolationLevel: StoreOptions.Value.DefaultIsolationLevel)) { var date = threshold.UtcDateTime; var count = await Repository.PruneAsync(date, cancellationToken: cancellationToken); From 325c5746a28ddb297cea563a922addf2d3102bf2 Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 26 Feb 2024 17:16:22 +0800 Subject: [PATCH 2/4] Make `DefaultIsolationLevel` nullable. --- .../Volo/Abp/OpenIddict/AbpOpenIddictStoreOptions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/AbpOpenIddictStoreOptions.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/AbpOpenIddictStoreOptions.cs index 5a4817a0f0..43343da9b8 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/AbpOpenIddictStoreOptions.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/AbpOpenIddictStoreOptions.cs @@ -4,7 +4,7 @@ namespace Volo.Abp.OpenIddict; public class AbpOpenIddictStoreOptions { - public IsolationLevel DefaultIsolationLevel { get; set; } + public IsolationLevel? DefaultIsolationLevel { get; set; } public AbpOpenIddictStoreOptions() { From a9c180461759663bb8ae5cf14d936d9611c417a9 Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 26 Feb 2024 17:26:39 +0800 Subject: [PATCH 3/4] Set `isolationLevel` to `Serializable ` for `Delete` methods. --- .../Volo/Abp/OpenIddict/AbpOpenIddictStoreOptions.cs | 7 +++++-- .../Applications/AbpOpenIddictApplicationStore.cs | 2 +- .../Authorizations/AbpOpenIddictAuthorizationStore.cs | 4 ++-- .../Volo/Abp/OpenIddict/Tokens/AbpOpenIddictTokenStore.cs | 2 +- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/AbpOpenIddictStoreOptions.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/AbpOpenIddictStoreOptions.cs index 43343da9b8..cfc9878c86 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/AbpOpenIddictStoreOptions.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/AbpOpenIddictStoreOptions.cs @@ -4,10 +4,13 @@ namespace Volo.Abp.OpenIddict; public class AbpOpenIddictStoreOptions { - public IsolationLevel? DefaultIsolationLevel { get; set; } + public IsolationLevel? PruneIsolationLevel { get; set; } + + public IsolationLevel? DeleteIsolationLevel { get; set; } public AbpOpenIddictStoreOptions() { - DefaultIsolationLevel = IsolationLevel.RepeatableRead; + PruneIsolationLevel = IsolationLevel.RepeatableRead; + DeleteIsolationLevel = IsolationLevel.Serializable; } } 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 db75bfa665..31c49807e2 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 @@ -61,7 +61,7 @@ public class AbpOpenIddictApplicationStore : AbpOpenIddictStoreBase PruneAsync(DateTimeOffset threshold, CancellationToken cancellationToken) { - using (var uow = UnitOfWorkManager.Begin(requiresNew: true, isTransactional: true, isolationLevel: StoreOptions.Value.DefaultIsolationLevel)) + using (var uow = UnitOfWorkManager.Begin(requiresNew: true, isTransactional: true, isolationLevel: StoreOptions.Value.PruneIsolationLevel)) { var date = threshold.UtcDateTime; var count = await Repository.PruneAsync(date, cancellationToken: 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 e8bcfff58d..c8d1f0895c 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 @@ -311,7 +311,7 @@ public class AbpOpenIddictTokenStore : AbpOpenIddictStoreBase PruneAsync(DateTimeOffset threshold, CancellationToken cancellationToken) { - using (var uow = UnitOfWorkManager.Begin(requiresNew: true, isTransactional: true, isolationLevel: StoreOptions.Value.DefaultIsolationLevel)) + using (var uow = UnitOfWorkManager.Begin(requiresNew: true, isTransactional: true, isolationLevel: StoreOptions.Value.PruneIsolationLevel)) { var date = threshold.UtcDateTime; var count = await Repository.PruneAsync(date, cancellationToken: cancellationToken); From 4bd8b9520b89c42fc066b9d00ac98bb3084651ae Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 27 Feb 2024 10:24:17 +0800 Subject: [PATCH 4/4] Update OpenIddict.md --- docs/en/Modules/OpenIddict.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/en/Modules/OpenIddict.md b/docs/en/Modules/OpenIddict.md index ef8dfe92ef..fe0b8270d3 100644 --- a/docs/en/Modules/OpenIddict.md +++ b/docs/en/Modules/OpenIddict.md @@ -215,6 +215,10 @@ This module implements OpenIddict stores: - `IOpenIddictScopeStore` - `IOpenIddictTokenStore` +#### AbpOpenIddictStoreOptions + +You can configure the `PruneIsolationLevel/DeleteIsolationLevel` of `AbpOpenIddictStoreOptions` to set the isolation level for the store operations becasue different databases have different isolation levels. + ##### Repositories The following custom repositories are defined in this module: