diff --git a/Directory.Packages.props b/Directory.Packages.props index f6db56e778..4d71fea445 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -120,11 +120,11 @@ - - - - - + + + + + diff --git a/modules/openiddict/app/OpenIddict.Demo.Client.BlazorWASM/Pages/Index.razor b/modules/openiddict/app/OpenIddict.Demo.Client.BlazorWASM/Pages/Index.razor index 7889736c35..648f6ab84b 100644 --- a/modules/openiddict/app/OpenIddict.Demo.Client.BlazorWASM/Pages/Index.razor +++ b/modules/openiddict/app/OpenIddict.Demo.Client.BlazorWASM/Pages/Index.razor @@ -21,9 +21,9 @@ Welcome to your new app. @if (_claims.Count() > 0) { -

+

    @foreach (var claim in _claims) diff --git a/modules/openiddict/app/OpenIddict.Demo.Client.BlazorWASM/Program.cs b/modules/openiddict/app/OpenIddict.Demo.Client.BlazorWASM/Program.cs index f4a96ba0f8..a2bd2c85e3 100644 --- a/modules/openiddict/app/OpenIddict.Demo.Client.BlazorWASM/Program.cs +++ b/modules/openiddict/app/OpenIddict.Demo.Client.BlazorWASM/Program.cs @@ -15,7 +15,7 @@ builder.Services.AddOidcAuthentication(options => options.ProviderOptions.ClientId = "AbpBlazorWASMApp"; options.ProviderOptions.ResponseType = "code"; - options.UserOptions.NameClaim = JwtClaimTypes.Name; + options.UserOptions.NameClaim = JwtClaimTypes.PreferredUserName; options.UserOptions.RoleClaim = JwtClaimTypes.Role; options.ProviderOptions.DefaultScopes.Add("roles"); diff --git a/modules/openiddict/app/OpenIddict.Demo.Server/EntityFrameworkCore/ServerDataSeedContributor.cs b/modules/openiddict/app/OpenIddict.Demo.Server/EntityFrameworkCore/ServerDataSeedContributor.cs index f63137a0e2..9d4aee74e7 100644 --- a/modules/openiddict/app/OpenIddict.Demo.Server/EntityFrameworkCore/ServerDataSeedContributor.cs +++ b/modules/openiddict/app/OpenIddict.Demo.Server/EntityFrameworkCore/ServerDataSeedContributor.cs @@ -67,10 +67,10 @@ public class ServerDataSeedContributor : IDataSeedContributor, ITransientDepende { OpenIddictConstants.Permissions.Endpoints.Authorization, OpenIddictConstants.Permissions.Endpoints.Token, - OpenIddictConstants.Permissions.Endpoints.Device, + OpenIddictConstants.Permissions.Endpoints.DeviceAuthorization, OpenIddictConstants.Permissions.Endpoints.Introspection, OpenIddictConstants.Permissions.Endpoints.Revocation, - OpenIddictConstants.Permissions.Endpoints.Logout, + OpenIddictConstants.Permissions.Endpoints.EndSession, OpenIddictConstants.Permissions.GrantTypes.AuthorizationCode, OpenIddictConstants.Permissions.GrantTypes.Implicit, @@ -125,10 +125,10 @@ public class ServerDataSeedContributor : IDataSeedContributor, ITransientDepende { OpenIddictConstants.Permissions.Endpoints.Authorization, OpenIddictConstants.Permissions.Endpoints.Token, - OpenIddictConstants.Permissions.Endpoints.Device, + OpenIddictConstants.Permissions.Endpoints.DeviceAuthorization, OpenIddictConstants.Permissions.Endpoints.Introspection, OpenIddictConstants.Permissions.Endpoints.Revocation, - OpenIddictConstants.Permissions.Endpoints.Logout, + OpenIddictConstants.Permissions.Endpoints.EndSession, OpenIddictConstants.Permissions.GrantTypes.AuthorizationCode, OpenIddictConstants.Permissions.GrantTypes.Implicit, diff --git a/modules/openiddict/app/OpenIddict.Demo.Server/Migrations/20240829013142_Initial.Designer.cs b/modules/openiddict/app/OpenIddict.Demo.Server/Migrations/20241005085943_Initial.Designer.cs similarity index 98% rename from modules/openiddict/app/OpenIddict.Demo.Server/Migrations/20240829013142_Initial.Designer.cs rename to modules/openiddict/app/OpenIddict.Demo.Server/Migrations/20241005085943_Initial.Designer.cs index 158f345fbe..7fffd314e8 100644 --- a/modules/openiddict/app/OpenIddict.Demo.Server/Migrations/20240829013142_Initial.Designer.cs +++ b/modules/openiddict/app/OpenIddict.Demo.Server/Migrations/20241005085943_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace OpenIddict.Demo.Server.Migrations { [DbContext(typeof(ServerDbContext))] - [Migration("20240829013142_Initial")] + [Migration("20241005085943_Initial")] partial class Initial { /// @@ -22,7 +22,7 @@ namespace OpenIddict.Demo.Server.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "8.0.4") + .HasAnnotation("ProductVersion", "9.0.0-rc.1.24451.1") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -394,6 +394,13 @@ namespace OpenIddict.Demo.Server.Migrations .HasMaxLength(64) .HasColumnType("nvarchar(64)"); + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + b.Property("Device") .IsRequired() .HasMaxLength(64) @@ -403,9 +410,14 @@ namespace OpenIddict.Demo.Server.Migrations .HasMaxLength(64) .HasColumnType("nvarchar(64)"); + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + b.Property("IpAddresses") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); b.Property("LastAccessed") .HasColumnType("datetime2"); diff --git a/modules/openiddict/app/OpenIddict.Demo.Server/Migrations/20240829013142_Initial.cs b/modules/openiddict/app/OpenIddict.Demo.Server/Migrations/20241005085943_Initial.cs similarity index 99% rename from modules/openiddict/app/OpenIddict.Demo.Server/Migrations/20240829013142_Initial.cs rename to modules/openiddict/app/OpenIddict.Demo.Server/Migrations/20241005085943_Initial.cs index 537745685f..62b23276c4 100644 --- a/modules/openiddict/app/OpenIddict.Demo.Server/Migrations/20240829013142_Initial.cs +++ b/modules/openiddict/app/OpenIddict.Demo.Server/Migrations/20241005085943_Initial.cs @@ -232,9 +232,11 @@ namespace OpenIddict.Demo.Server.Migrations TenantId = table.Column(type: "uniqueidentifier", nullable: true), UserId = table.Column(type: "uniqueidentifier", nullable: false), ClientId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), - IpAddresses = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + IpAddresses = table.Column(type: "nvarchar(2048)", maxLength: 2048, nullable: true), SignedIn = table.Column(type: "datetime2", nullable: false), - LastAccessed = table.Column(type: "datetime2", nullable: true) + LastAccessed = table.Column(type: "datetime2", nullable: true), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: false), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: false) }, constraints: table => { diff --git a/modules/openiddict/app/OpenIddict.Demo.Server/Migrations/ServerDbContextModelSnapshot.cs b/modules/openiddict/app/OpenIddict.Demo.Server/Migrations/ServerDbContextModelSnapshot.cs index bdbb1fca9b..fbaf0bc710 100644 --- a/modules/openiddict/app/OpenIddict.Demo.Server/Migrations/ServerDbContextModelSnapshot.cs +++ b/modules/openiddict/app/OpenIddict.Demo.Server/Migrations/ServerDbContextModelSnapshot.cs @@ -19,7 +19,7 @@ namespace OpenIddict.Demo.Server.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "8.0.4") + .HasAnnotation("ProductVersion", "9.0.0-rc.1.24451.1") .HasAnnotation("Relational:MaxIdentifierLength", 128); SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); @@ -391,6 +391,13 @@ namespace OpenIddict.Demo.Server.Migrations .HasMaxLength(64) .HasColumnType("nvarchar(64)"); + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + b.Property("Device") .IsRequired() .HasMaxLength(64) @@ -400,9 +407,14 @@ namespace OpenIddict.Demo.Server.Migrations .HasMaxLength(64) .HasColumnType("nvarchar(64)"); + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + b.Property("IpAddresses") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); b.Property("LastAccessed") .HasColumnType("datetime2"); diff --git a/modules/openiddict/app/OpenIddict.Demo.Server/OpenIddictServerModule.cs b/modules/openiddict/app/OpenIddict.Demo.Server/OpenIddictServerModule.cs index b6e262ee32..dd8ba1df2d 100644 --- a/modules/openiddict/app/OpenIddict.Demo.Server/OpenIddictServerModule.cs +++ b/modules/openiddict/app/OpenIddict.Demo.Server/OpenIddictServerModule.cs @@ -89,24 +89,7 @@ public class OpenIddictServerModule : AbpModule PreConfigure(builder => { - //https://documentation.openiddict.com/configuration/encryption-and-signing-credentials.html - using (var algorithm = RSA.Create(keySizeInBits: 2048)) - { - var subject = new X500DistinguishedName("CN=Fabrikam Encryption Certificate"); - var request = new CertificateRequest(subject, algorithm, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1); - request.CertificateExtensions.Add(new X509KeyUsageExtension(X509KeyUsageFlags.DigitalSignature, critical: true)); - var certificate = request.CreateSelfSigned(DateTimeOffset.UtcNow, DateTimeOffset.UtcNow.AddYears(2)); - builder.AddSigningCertificate(certificate); - } - - using (var algorithm = RSA.Create(keySizeInBits: 2048)) - { - var subject = new X500DistinguishedName("CN=Fabrikam Signing Certificate"); - var request = new CertificateRequest(subject, algorithm, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1); - request.CertificateExtensions.Add(new X509KeyUsageExtension(X509KeyUsageFlags.KeyEncipherment, critical: true)); - var certificate = request.CreateSelfSigned(DateTimeOffset.UtcNow, DateTimeOffset.UtcNow.AddYears(2)); - builder.AddEncryptionCertificate(certificate); - } + builder.AddProductionEncryptionAndSigningCertificate("openiddict.pfx", "00000000-0000-0000-0000-000000000000"); builder.Configure(openIddictServerOptions => { diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/AbpOpenIddictAspNetCoreModule.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/AbpOpenIddictAspNetCoreModule.cs index 1b8fb5d39c..94e662f936 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/AbpOpenIddictAspNetCoreModule.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/AbpOpenIddictAspNetCoreModule.cs @@ -62,13 +62,13 @@ public class AbpOpenIddictAspNetCoreModule : AbpModule //.SetConfigurationEndpointUris() // .well-known/jwks //.SetCryptographyEndpointUris() - .SetDeviceEndpointUris("device") + .SetDeviceAuthorizationEndpointUris("device") .SetIntrospectionEndpointUris("connect/introspect") - .SetLogoutEndpointUris("connect/logout") + .SetEndSessionEndpointUris("connect/endsession") .SetRevocationEndpointUris("connect/revocat") .SetTokenEndpointUris("connect/token") - .SetUserinfoEndpointUris("connect/userinfo") - .SetVerificationEndpointUris("connect/verify"); + .SetUserInfoEndpointUris("connect/userinfo") + .SetEndUserVerificationEndpointUris("connect/verify"); builder .AllowAuthorizationCodeFlow() @@ -77,7 +77,7 @@ public class AbpOpenIddictAspNetCoreModule : AbpModule .AllowPasswordFlow() .AllowClientCredentialsFlow() .AllowRefreshTokenFlow() - .AllowDeviceCodeFlow() + .AllowDeviceAuthorizationFlow() .AllowNoneFlow(); builder.RegisterScopes(new[] @@ -94,9 +94,9 @@ public class AbpOpenIddictAspNetCoreModule : AbpModule builder.UseAspNetCore() .EnableAuthorizationEndpointPassthrough() .EnableTokenEndpointPassthrough() - .EnableUserinfoEndpointPassthrough() - .EnableLogoutEndpointPassthrough() - .EnableVerificationEndpointPassthrough() + .EnableUserInfoEndpointPassthrough() + .EnableEndSessionEndpointPassthrough() + .EnableEndUserVerificationEndpointPassthrough() .EnableStatusCodePagesIntegration(); if (builderOptions.AddDevelopmentEncryptionAndSigningCertificate) diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/AuthorizeController.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/AuthorizeController.cs index 5b28962f37..27f266b7ea 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/AuthorizeController.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/AuthorizeController.cs @@ -30,11 +30,11 @@ public class AuthorizeController : AbpOpenIdDictControllerBase // If prompt=login was specified by the client application, // immediately return the user agent to the login page. - if (request.HasPrompt(OpenIddictConstants.Prompts.Login)) + if (request.HasPrompt(OpenIddictConstants.PromptValues.Login)) { // To avoid endless login -> authorization redirects, the prompt=login flag // is removed from the authorization request payload before redirecting the user. - var prompt = string.Join(" ", request.GetPrompts().Remove(OpenIddictConstants.Prompts.Login)); + var prompt = string.Join(" ", request.GetPrompts().Remove(OpenIddictConstants.PromptValues.Login)); var parameters = Request.HasFormContentType ? Request.Form.Where(parameter => parameter.Key != OpenIddictConstants.Parameters.Prompt).ToList() : @@ -59,7 +59,7 @@ public class AuthorizeController : AbpOpenIdDictControllerBase { // If the client application requested promptless authentication, // return an error indicating that the user is not logged in. - if (request.HasPrompt(OpenIddictConstants.Prompts.None)) + if (request.HasPrompt(OpenIddictConstants.PromptValues.None)) { return Forbid( authenticationSchemes: OpenIddictServerAspNetCoreDefaults.AuthenticationScheme, @@ -137,7 +137,7 @@ public class AuthorizeController : AbpOpenIdDictControllerBase // return an authorization response without displaying the consent form. case OpenIddictConstants.ConsentTypes.Implicit: case OpenIddictConstants.ConsentTypes.External when authorizations.Any(): - case OpenIddictConstants.ConsentTypes.Explicit when authorizations.Any() && !request.HasPrompt(OpenIddictConstants.Prompts.Consent): + case OpenIddictConstants.ConsentTypes.Explicit when authorizations.Any() && !request.HasPrompt(OpenIddictConstants.PromptValues.Consent): var principal = await SignInManager.CreateUserPrincipalAsync(user); if (result.Properties != null && result.Properties.IsPersistent) @@ -173,8 +173,8 @@ public class AuthorizeController : AbpOpenIdDictControllerBase // At this point, no authorization was found in the database and an error must be returned // if the client application specified prompt=none in the authorization request. - case OpenIddictConstants.ConsentTypes.Explicit when request.HasPrompt(OpenIddictConstants.Prompts.None): - case OpenIddictConstants.ConsentTypes.Systematic when request.HasPrompt(OpenIddictConstants.Prompts.None): + case OpenIddictConstants.ConsentTypes.Explicit when request.HasPrompt(OpenIddictConstants.PromptValues.None): + case OpenIddictConstants.ConsentTypes.Systematic when request.HasPrompt(OpenIddictConstants.PromptValues.None): return Forbid( authenticationSchemes: OpenIddictServerAspNetCoreDefaults.AuthenticationScheme, properties: new AuthenticationProperties(new Dictionary diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/LogoutController.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/EndSessionController.cs similarity index 93% rename from modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/LogoutController.cs rename to modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/EndSessionController.cs index 34796ea6a9..627479813b 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/LogoutController.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Controllers/EndSessionController.cs @@ -1,11 +1,10 @@ using System.Threading.Tasks; -using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Mvc; using OpenIddict.Server.AspNetCore; namespace Volo.Abp.OpenIddict.Controllers; -[Route("connect/logout")] +[Route("connect/endsession")] [ApiExplorerSettings(IgnoreApi = true)] public class LogoutController : AbpOpenIdDictControllerBase { diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/WildcardDomains/AbpValidateAuthorizedParty.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/WildcardDomains/AbpValidateAuthorizedParty.cs index 5c22de29a2..eaae81d714 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/WildcardDomains/AbpValidateAuthorizedParty.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/WildcardDomains/AbpValidateAuthorizedParty.cs @@ -5,10 +5,10 @@ using OpenIddict.Server; namespace Volo.Abp.OpenIddict.WildcardDomains; -public class AbpValidateAuthorizedParty : AbpOpenIddictWildcardDomainBase +public class AbpValidateAuthorizedParty : AbpOpenIddictWildcardDomainBase { public static OpenIddictServerHandlerDescriptor Descriptor { get; } - = OpenIddictServerHandlerDescriptor.CreateBuilder() + = OpenIddictServerHandlerDescriptor.CreateBuilder() .UseScopedHandler() .SetOrder(OpenIddictServerHandlers.Session.ValidateEndpointPermissions.Descriptor.Order + 1_000) .SetType(OpenIddictServerHandlerType.BuiltIn) @@ -22,7 +22,7 @@ public class AbpValidateAuthorizedParty : AbpOpenIddictWildcardDomainBase +public class AbpValidateClientPostLogoutRedirectUri : AbpOpenIddictWildcardDomainBase { public static OpenIddictServerHandlerDescriptor Descriptor { get; } - = OpenIddictServerHandlerDescriptor.CreateBuilder() + = OpenIddictServerHandlerDescriptor.CreateBuilder() .AddFilter() .AddFilter() .UseScopedHandler() @@ -24,7 +24,7 @@ public class AbpValidateClientPostLogoutRedirectUri : AbpOpenIddictWildcardDomai OriginalHandler = new OpenIddictServerHandlers.Session.ValidateClientPostLogoutRedirectUri(applicationManager); } - public async override ValueTask HandleAsync(OpenIddictServerEvents.ValidateLogoutRequestContext context) + public async override ValueTask HandleAsync(OpenIddictServerEvents.ValidateEndSessionRequestContext context) { Check.NotNull(context, nameof(context)); Check.NotNullOrEmpty(context.PostLogoutRedirectUri, nameof(context.PostLogoutRedirectUri)); diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/WildcardDomains/AbpValidatePostLogoutRedirectUriParameter.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/WildcardDomains/AbpValidatePostLogoutRedirectUriParameter.cs index d96592944c..fe54259121 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/WildcardDomains/AbpValidatePostLogoutRedirectUriParameter.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/WildcardDomains/AbpValidatePostLogoutRedirectUriParameter.cs @@ -4,10 +4,10 @@ using OpenIddict.Server; namespace Volo.Abp.OpenIddict.WildcardDomains; -public class AbpValidatePostLogoutRedirectUriParameter : AbpOpenIddictWildcardDomainBase +public class AbpValidatePostLogoutRedirectUriParameter : AbpOpenIddictWildcardDomainBase { public static OpenIddictServerHandlerDescriptor Descriptor { get; } - = OpenIddictServerHandlerDescriptor.CreateBuilder() + = OpenIddictServerHandlerDescriptor.CreateBuilder() .UseSingletonHandler() .SetOrder(int.MinValue + 100_000) .SetType(OpenIddictServerHandlerType.BuiltIn) @@ -18,7 +18,7 @@ public class AbpValidatePostLogoutRedirectUriParameter : AbpOpenIddictWildcardDo { } - public async override ValueTask HandleAsync(OpenIddictServerEvents.ValidateLogoutRequestContext context) + public async override ValueTask HandleAsync(OpenIddictServerEvents.ValidateEndSessionRequestContext context) { Check.NotNull(context, nameof(context)); 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 7d63ebd97c..76e2d5b295 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 @@ -300,6 +300,23 @@ public class AbpOpenIddictAuthorizationStore : AbpOpenIddictStoreBase RevokeByApplicationIdAsync(string identifier, CancellationToken cancellationToken) + { + Check.NotNullOrEmpty(identifier, nameof(identifier)); + + var key = ConvertIdentifierFromString(identifier); + + return await Repository.RevokeByApplicationIdAsync(key, cancellationToken: cancellationToken); + } + + /// + public virtual async ValueTask RevokeBySubjectAsync(string subject, CancellationToken cancellationToken) + { + Check.NotNullOrEmpty(subject, nameof(subject)); + + return await Repository.RevokeBySubjectAsync(subject, cancellationToken: cancellationToken); + } + public virtual async ValueTask SetApplicationIdAsync(OpenIddictAuthorizationModel authorization, string identifier, CancellationToken cancellationToken) { Check.NotNull(authorization, nameof(authorization)); diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Authorizations/IOpenIddictAuthorizationRepository.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Authorizations/IOpenIddictAuthorizationRepository.cs index 98c98b3e58..ea5b943426 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Authorizations/IOpenIddictAuthorizationRepository.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Authorizations/IOpenIddictAuthorizationRepository.cs @@ -23,4 +23,8 @@ public interface IOpenIddictAuthorizationRepository : IBasicRepository> ListAsync(int? count, int? offset, CancellationToken cancellationToken = default); Task PruneAsync(DateTime date, CancellationToken cancellationToken = default); + + ValueTask RevokeByApplicationIdAsync(Guid applicationId, CancellationToken cancellationToken = default); + + ValueTask RevokeBySubjectAsync(string subject, CancellationToken cancellationToken = default); } 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 7e2bf3dff3..8e4123b0db 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 @@ -320,6 +320,15 @@ public class AbpOpenIddictTokenStore : AbpOpenIddictStoreBase RevokeByApplicationIdAsync(string identifier, CancellationToken cancellationToken) + { + Check.NotNullOrEmpty(identifier, nameof(identifier)); + + var key = ConvertIdentifierFromString(identifier); + + return await Repository.RevokeByApplicationIdAsync(key, cancellationToken); + } + public virtual async ValueTask SetApplicationIdAsync(OpenIddictTokenModel token, string identifier, CancellationToken cancellationToken) { Check.NotNull(token, nameof(token)); @@ -335,6 +344,13 @@ public class AbpOpenIddictTokenStore : AbpOpenIddictStoreBase RevokeBySubjectAsync(string subject, CancellationToken cancellationToken) + { + Check.NotNullOrEmpty(subject, nameof(subject)); + + return await Repository.RevokeBySubjectAsync(subject, cancellationToken); + } + public virtual async ValueTask SetAuthorizationIdAsync(OpenIddictTokenModel token, string identifier, CancellationToken cancellationToken) { Check.NotNull(token, nameof(token)); diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Tokens/IOpenIddictTokenRepository.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Tokens/IOpenIddictTokenRepository.cs index 1a1877746a..b17ab2eb19 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Tokens/IOpenIddictTokenRepository.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Tokens/IOpenIddictTokenRepository.cs @@ -34,5 +34,9 @@ public interface IOpenIddictTokenRepository : IBasicRepository PruneAsync(DateTime date, CancellationToken cancellationToken = default); - ValueTask RevokeByAuthorizationIdAsync(Guid id, CancellationToken cancellationToken); + ValueTask RevokeByAuthorizationIdAsync(Guid id, CancellationToken cancellationToken = default); + + ValueTask RevokeByApplicationIdAsync(Guid applicationId, CancellationToken cancellationToken = default); + + ValueTask RevokeBySubjectAsync(string subject, CancellationToken cancellationToken = default); } diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.EntityFrameworkCore/Volo/Abp/OpenIddict/Authorizations/EfCoreOpenIddictAuthorizationRepository.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.EntityFrameworkCore/Volo/Abp/OpenIddict/Authorizations/EfCoreOpenIddictAuthorizationRepository.cs index 62cf3abdd4..d6ecad1bc4 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.EntityFrameworkCore/Volo/Abp/OpenIddict/Authorizations/EfCoreOpenIddictAuthorizationRepository.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.EntityFrameworkCore/Volo/Abp/OpenIddict/Authorizations/EfCoreOpenIddictAuthorizationRepository.cs @@ -98,4 +98,20 @@ public class EfCoreOpenIddictAuthorizationRepository : EfCoreRepository authorizations.Contains(x.Id)).ExecuteDeleteAsync(cancellationToken); } + + public virtual async ValueTask RevokeByApplicationIdAsync(Guid applicationId, CancellationToken cancellationToken = default) + { + return await (from authorization in await GetQueryableAsync() + where authorization.ApplicationId == applicationId + select authorization).ExecuteUpdateAsync(entity => entity.SetProperty( + authorization => authorization.Status, OpenIddictConstants.Statuses.Revoked), cancellationToken); + } + + public virtual async ValueTask RevokeBySubjectAsync(string subject, CancellationToken cancellationToken = default) + { + return await (from authorization in await GetQueryableAsync() + where authorization.Subject == subject + select authorization).ExecuteUpdateAsync(entity => entity.SetProperty( + authorization => authorization.Status, OpenIddictConstants.Statuses.Revoked), cancellationToken); + } } diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.EntityFrameworkCore/Volo/Abp/OpenIddict/Tokens/EfCoreOpenIddictTokenRepository.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.EntityFrameworkCore/Volo/Abp/OpenIddict/Tokens/EfCoreOpenIddictTokenRepository.cs index d861f8b54e..4c99be15ce 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.EntityFrameworkCore/Volo/Abp/OpenIddict/Tokens/EfCoreOpenIddictTokenRepository.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.EntityFrameworkCore/Volo/Abp/OpenIddict/Tokens/EfCoreOpenIddictTokenRepository.cs @@ -117,4 +117,20 @@ public class EfCoreOpenIddictTokenRepository : EfCoreRepository entity.SetProperty(token => token.Status, OpenIddictConstants.Statuses.Revoked), GetCancellationToken(cancellationToken)); } + + public virtual async ValueTask RevokeByApplicationIdAsync(Guid applicationId, CancellationToken cancellationToken) + { + return await (from token in await GetQueryableAsync() + where token.ApplicationId == applicationId + select token).ExecuteUpdateAsync(entity => entity.SetProperty( + token => token.Status, OpenIddictConstants.Statuses.Revoked), cancellationToken); + } + + public virtual async ValueTask RevokeBySubjectAsync(string subject, CancellationToken cancellationToken) + { + return await (from token in await GetQueryableAsync() + where token.Subject == subject + select token).ExecuteUpdateAsync(entity => entity.SetProperty( + token => token.Status, OpenIddictConstants.Statuses.Revoked), cancellationToken); + } } diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.MongoDB/Volo/Abp/OpenIddict/Authorizations/MongoOpenIddictAuthorizationRepository.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.MongoDB/Volo/Abp/OpenIddict/Authorizations/MongoOpenIddictAuthorizationRepository.cs index 3e30912a8d..e76e59c1b0 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.MongoDB/Volo/Abp/OpenIddict/Authorizations/MongoOpenIddictAuthorizationRepository.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.MongoDB/Volo/Abp/OpenIddict/Authorizations/MongoOpenIddictAuthorizationRepository.cs @@ -109,4 +109,22 @@ public class MongoOpenIddictAuthorizationRepository : MongoDbRepository RevokeByApplicationIdAsync(Guid applicationId, CancellationToken cancellationToken = default) + { + return (await (await GetCollectionAsync(cancellationToken)).UpdateManyAsync( + filter : authorization => authorization.ApplicationId == applicationId, + update : Builders.Update.Set(authorization => authorization.Status, OpenIddictConstants.Statuses.Revoked), + options : null, + cancellationToken: cancellationToken)).MatchedCount; + } + + public virtual async ValueTask RevokeBySubjectAsync(string subject, CancellationToken cancellationToken = default) + { + return (await (await GetCollectionAsync(cancellationToken)).UpdateManyAsync( + filter : authorization => authorization.Subject == subject, + update : Builders.Update.Set(authorization => authorization.Status, OpenIddictConstants.Statuses.Revoked), + options : null, + cancellationToken: cancellationToken)).MatchedCount; + } } diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.MongoDB/Volo/Abp/OpenIddict/Tokens/MongoOpenIddictTokenRepository.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.MongoDB/Volo/Abp/OpenIddict/Tokens/MongoOpenIddictTokenRepository.cs index 13898b0e4c..548a1c6638 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.MongoDB/Volo/Abp/OpenIddict/Tokens/MongoOpenIddictTokenRepository.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.MongoDB/Volo/Abp/OpenIddict/Tokens/MongoOpenIddictTokenRepository.cs @@ -132,9 +132,27 @@ public class MongoOpenIddictTokenRepository : MongoDbRepository RevokeByAuthorizationIdAsync(Guid id, CancellationToken cancellationToken) { return (await (await GetCollectionAsync(GetCancellationToken(cancellationToken))).UpdateManyAsync( - filter: token => token.AuthorizationId == id, - update: Builders.Update.Set(token => token.Status, OpenIddictConstants.Statuses.Revoked), - options: null, + filter : token => token.AuthorizationId == id, + update : Builders.Update.Set(token => token.Status, OpenIddictConstants.Statuses.Revoked), + options : null, cancellationToken: GetCancellationToken(cancellationToken))).MatchedCount; } + + public virtual async ValueTask RevokeByApplicationIdAsync(Guid applicationId, CancellationToken cancellationToken) + { + return (await (await GetCollectionAsync(cancellationToken)).UpdateManyAsync( + filter : token => token.ApplicationId == applicationId, + update : Builders.Update.Set(token => token.Status, OpenIddictConstants.Statuses.Revoked), + options : null, + cancellationToken: cancellationToken)).MatchedCount; + } + + public virtual async ValueTask RevokeBySubjectAsync(string subject, CancellationToken cancellationToken) + { + return (await (await GetCollectionAsync(cancellationToken)).UpdateManyAsync( + filter : token => token.Subject == subject, + update : Builders.Update.Set(token => token.Status, OpenIddictConstants.Statuses.Revoked), + options : null, + cancellationToken: cancellationToken)).MatchedCount; + } } diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo/Abp/OpenIddict/Authorizations/AbpOpenIddictAuthorizationStore_Tests.cs b/modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo/Abp/OpenIddict/Authorizations/AbpOpenIddictAuthorizationStore_Tests.cs index 2fbd875713..3e2cf71b1d 100644 --- a/modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo/Abp/OpenIddict/Authorizations/AbpOpenIddictAuthorizationStore_Tests.cs +++ b/modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo/Abp/OpenIddict/Authorizations/AbpOpenIddictAuthorizationStore_Tests.cs @@ -13,13 +13,13 @@ public class AbpOpenIddictAuthorizationStore_Tests : OpenIddictDomainTestBase { private readonly IOpenIddictAuthorizationStore _authorizationStore; private readonly AbpOpenIddictTestData _testData; - + public AbpOpenIddictAuthorizationStore_Tests() { _authorizationStore = ServiceProvider.GetRequiredService>(); _testData = ServiceProvider.GetRequiredService(); } - + [Fact] public async Task CountAsync() { @@ -35,7 +35,7 @@ public class AbpOpenIddictAuthorizationStore_Tests : OpenIddictDomainTestBase Id = id, ApplicationId = _testData.App1Id, Status = "TestStatus3", - Subject = "TestSubject3", + Subject = _testData.Subject3, Type = OpenIddictConstants.AuthorizationTypes.Permanent }, CancellationToken.None); @@ -43,7 +43,7 @@ public class AbpOpenIddictAuthorizationStore_Tests : OpenIddictDomainTestBase authorization.ShouldNotBeNull(); authorization.Status.ShouldBe("TestStatus3"); - authorization.Subject.ShouldBe("TestSubject3"); + authorization.Subject.ShouldBe(_testData.Subject3); authorization.Type.ShouldBe(OpenIddictConstants.AuthorizationTypes.Permanent); } @@ -52,7 +52,7 @@ public class AbpOpenIddictAuthorizationStore_Tests : OpenIddictDomainTestBase { var authorization = await _authorizationStore.FindByIdAsync(_testData.Authorization1Id.ToString(), CancellationToken.None); await _authorizationStore.DeleteAsync(authorization, CancellationToken.None); - + authorization = await _authorizationStore.FindByIdAsync(_testData.Authorization1Id.ToString(), CancellationToken.None); authorization.ShouldBeNull(); } @@ -63,22 +63,22 @@ public class AbpOpenIddictAuthorizationStore_Tests : OpenIddictDomainTestBase var authorization = await _authorizationStore.FindByIdAsync(new Guid().ToString(), CancellationToken.None); authorization.ShouldBeNull(); } - + [Fact] public async Task FindByIdAsync_Should_Return_Authorization_If_Not_Found() { var authorization = await _authorizationStore.FindByIdAsync(_testData.Authorization1Id.ToString(), CancellationToken.None); authorization.ShouldNotBeNull(); authorization.Status.ShouldBe(OpenIddictConstants.Statuses.Valid); - authorization.Subject.ShouldBe("TestSubject1"); + authorization.Subject.ShouldBe(_testData.Subject1); authorization.Type.ShouldBe(OpenIddictConstants.AuthorizationTypes.Permanent); } - + [Fact] public async Task FindByApplicationIdAsync_Should_Return_Empty_If_Not_Found() { var authorizations = await _authorizationStore.FindByApplicationIdAsync(new Guid().ToString(), CancellationToken.None).ToListAsync(); - + authorizations.Count.ShouldBe(0); } @@ -86,24 +86,24 @@ public class AbpOpenIddictAuthorizationStore_Tests : OpenIddictDomainTestBase public async Task FindByApplicationIdAsync_Should_Return_Authorizations_If_Found() { var authorizations = await _authorizationStore.FindByApplicationIdAsync(_testData.App1Id.ToString(), CancellationToken.None).ToListAsync(); - - authorizations.Count.ShouldBe(1); + + authorizations.Count.ShouldBe(1); } - + [Fact] public async Task FindBySubjectAsync_Should_Return_Empty_If_Not_Found() { var authorizations = await _authorizationStore.FindBySubjectAsync(new Guid().ToString(), CancellationToken.None).ToListAsync(); - + authorizations.Count.ShouldBe(0); } [Fact] public async Task FindBySubjectAsync_Should_Return_Authorizations_If_Found() { - var authorizations = await _authorizationStore.FindBySubjectAsync("TestSubject1", CancellationToken.None).ToListAsync(); - - authorizations.Count.ShouldBe(1); + var authorizations = await _authorizationStore.FindBySubjectAsync(_testData.Subject1, CancellationToken.None).ToListAsync(); + + authorizations.Count.ShouldBe(1); } [Fact] @@ -117,9 +117,9 @@ public class AbpOpenIddictAuthorizationStore_Tests : OpenIddictDomainTestBase authorization.ApplicationId = _testData.App2Id; await _authorizationStore.UpdateAsync(authorization, CancellationToken.None); - + authorization = await _authorizationStore.FindByIdAsync(_testData.Authorization1Id.ToString(), CancellationToken.None); - + authorization.Status.ShouldBe("New status"); authorization.Subject.ShouldBe("New subject"); authorization.Type.ShouldBe(OpenIddictConstants.AuthorizationTypes.AdHoc); diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo/Abp/OpenIddict/Tokens/AbpOpenIddictTokenStore_Tests.cs b/modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo/Abp/OpenIddict/Tokens/AbpOpenIddictTokenStore_Tests.cs index feaa7b38a4..2b3ac233f3 100644 --- a/modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo/Abp/OpenIddict/Tokens/AbpOpenIddictTokenStore_Tests.cs +++ b/modules/openiddict/test/Volo.Abp.OpenIddict.Domain.Tests/Volo/Abp/OpenIddict/Tokens/AbpOpenIddictTokenStore_Tests.cs @@ -34,19 +34,19 @@ public class AbpOpenIddictTokenStore_Tests : OpenIddictDomainTestBase { ApplicationId = _testData.App1Id, Payload = "TestPayload3", - Subject = "TestSubject3", + Subject = _testData.Subject3, Type = "TestType3", Status = OpenIddictConstants.Statuses.Inactive, }, CancellationToken.None); - var tokens = await _tokenStore.FindBySubjectAsync("TestSubject3", CancellationToken.None).ToListAsync(); + var tokens = await _tokenStore.FindBySubjectAsync(_testData.Subject3, CancellationToken.None).ToListAsync(); tokens.Count.ShouldBe(1); var token = tokens.First(); token.ApplicationId.ShouldBe(_testData.App1Id); token.Payload.ShouldBe("TestPayload3"); - token.Subject.ShouldBe("TestSubject3"); + token.Subject.ShouldBe(_testData.Subject3); token.Type.ShouldBe("TestType3"); token.Status.ShouldBe(OpenIddictConstants.Statuses.Inactive); } @@ -73,7 +73,7 @@ public class AbpOpenIddictTokenStore_Tests : OpenIddictDomainTestBase [Fact] public async Task FindAsync_Should_Return_Tokens_If_Found() { - var tokens = await _tokenStore.FindAsync("TestSubject1", _testData.App1Id.ToString(),OpenIddictConstants.Statuses.Redeemed, "TestType1", CancellationToken.None).ToListAsync(); + var tokens = await _tokenStore.FindAsync(_testData.Subject1, _testData.App1Id.ToString(),OpenIddictConstants.Statuses.Redeemed, "TestType1", CancellationToken.None).ToListAsync(); tokens.Count.ShouldBe(1); } @@ -110,7 +110,7 @@ public class AbpOpenIddictTokenStore_Tests : OpenIddictDomainTestBase token.ShouldNotBeNull(); token.ApplicationId.ShouldBe(_testData.App1Id); token.Payload.ShouldBe("TestPayload1"); - token.Subject.ShouldBe("TestSubject1"); + token.Subject.ShouldBe(_testData.Subject1); token.Type.ShouldBe("TestType1"); token.Status.ShouldBe(OpenIddictConstants.Statuses.Redeemed); token.ExpirationDate.ShouldNotBeNull(); diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/AbpOpenIddictTestData.cs b/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/AbpOpenIddictTestData.cs index f31208ed2f..3505a8d903 100644 --- a/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/AbpOpenIddictTestData.cs +++ b/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/AbpOpenIddictTestData.cs @@ -9,10 +9,13 @@ public class AbpOpenIddictTestData : ISingletonDependency public string App1ClientId { get; set; } = "Client1"; public Guid App2Id { get; set; } = Guid.NewGuid(); public string App2ClientId { get; set; } = "Client2"; - public Guid Scope1Id { get; set; } = Guid.NewGuid(); public string Scope1Name { get; set; } = "Scope1"; public Guid Scope2Id { get; set; } = Guid.NewGuid(); + public string Subject1 { get; set; } = "Subject1"; + public string Subject2 { get; set; } = "Subject2"; + public string Subject3 { get; set; } = "Subject3"; + public string Scope2Name { get; set; } = "Scope2"; public Guid Token1Id { get; set; } = Guid.NewGuid(); @@ -20,6 +23,6 @@ public class AbpOpenIddictTestData : ISingletonDependency public Guid Token2Id { get; set; } = Guid.NewGuid(); public Guid Authorization1Id { get; set; } = Guid.NewGuid(); - + public Guid Authorization2Id { get; set; } = Guid.NewGuid(); -} \ No newline at end of file +} diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/OpenIddictAuthorizationRepository_Tests.cs b/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/OpenIddictAuthorizationRepository_Tests.cs index 529849ed66..e545854a06 100644 --- a/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/OpenIddictAuthorizationRepository_Tests.cs +++ b/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/OpenIddictAuthorizationRepository_Tests.cs @@ -24,12 +24,12 @@ public abstract class OpenIddictAuthorizationRepository_Tests : [Fact] public async Task FindAsync() { - (await _authorizationRepository.FindAsync(subject:"TestSubject1", client: new Guid())).Count.ShouldBe(0); - (await _authorizationRepository.FindAsync(subject:"TestSubject1", client: _testData.App1Id)).Count.ShouldBe(1); - (await _authorizationRepository.FindAsync(subject:"TestSubject1", client: _testData.App1Id, status: "NonExistsStatus")).Count.ShouldBe(0); - (await _authorizationRepository.FindAsync(subject:"TestSubject1", client: _testData.App1Id, status: OpenIddictConstants.Statuses.Valid)).Count.ShouldBe(1); - (await _authorizationRepository.FindAsync(subject:"TestSubject1", client: _testData.App1Id, status: OpenIddictConstants.Statuses.Valid ,type: "NonExistsType")).Count.ShouldBe(0); - (await _authorizationRepository.FindAsync(subject:"TestSubject1", client: _testData.App1Id, status: OpenIddictConstants.Statuses.Valid ,type: OpenIddictConstants.AuthorizationTypes.Permanent)).Count.ShouldBe(1); + (await _authorizationRepository.FindAsync(subject: _testData.Subject1, client: new Guid())).Count.ShouldBe(0); + (await _authorizationRepository.FindAsync(subject: _testData.Subject1, client: _testData.App1Id)).Count.ShouldBe(1); + (await _authorizationRepository.FindAsync(subject: _testData.Subject1, client: _testData.App1Id, status: "NonExistsStatus")).Count.ShouldBe(0); + (await _authorizationRepository.FindAsync(subject: _testData.Subject1, client: _testData.App1Id, status: OpenIddictConstants.Statuses.Valid)).Count.ShouldBe(1); + (await _authorizationRepository.FindAsync(subject: _testData.Subject1, client: _testData.App1Id, status: OpenIddictConstants.Statuses.Valid ,type: "NonExistsType")).Count.ShouldBe(0); + (await _authorizationRepository.FindAsync(subject: _testData.Subject1, client: _testData.App1Id, status: OpenIddictConstants.Statuses.Valid ,type: OpenIddictConstants.AuthorizationTypes.Permanent)).Count.ShouldBe(1); } [Fact] @@ -53,7 +53,7 @@ public abstract class OpenIddictAuthorizationRepository_Tests : [Fact] public async Task FindBySubjectAsync() { - (await _authorizationRepository.FindBySubjectAsync(subject:"TestSubject1")).Count.ShouldBe(1); + (await _authorizationRepository.FindBySubjectAsync(subject: _testData.Subject1)).Count.ShouldBe(1); } [Fact] @@ -70,4 +70,36 @@ public abstract class OpenIddictAuthorizationRepository_Tests : await _authorizationRepository.PruneAsync(DateTime.UtcNow - TimeSpan.FromDays(14)); (await _authorizationRepository.ListAsync(int.MaxValue, 0)).Count.ShouldBe(1); } + + [Fact] + public async Task RevokeByApplicationIdAsync() + { + var authorizations = await _authorizationRepository.FindByApplicationIdAsync(_testData.App1Id); + authorizations.Count.ShouldBe(1); + authorizations.First().ApplicationId.ShouldBe(_testData.App1Id); + authorizations.First().Status.ShouldBe(OpenIddictConstants.Statuses.Valid); + + (await _authorizationRepository.RevokeByApplicationIdAsync(_testData.App1Id)).ShouldBe(1); + + authorizations = await _authorizationRepository.FindByApplicationIdAsync(_testData.App1Id); + authorizations.Count.ShouldBe(1); + authorizations.First().ApplicationId.ShouldBe(_testData.App1Id); + authorizations.First().Status.ShouldBe(OpenIddictConstants.Statuses.Revoked); + } + + [Fact] + public async Task RevokeBySubjectAsync() + { + var authorizations = await _authorizationRepository.FindBySubjectAsync(_testData.Subject1); + authorizations.Count.ShouldBe(1); + authorizations.First().Subject.ShouldBe(_testData.Subject1); + authorizations.First().Status.ShouldBe(OpenIddictConstants.Statuses.Valid); + + (await _authorizationRepository.RevokeBySubjectAsync(_testData.Subject1)).ShouldBe(1); + + authorizations = await _authorizationRepository.FindBySubjectAsync(_testData.Subject1); + authorizations.Count.ShouldBe(1); + authorizations.First().Subject.ShouldBe(_testData.Subject1); + authorizations.First().Status.ShouldBe(OpenIddictConstants.Statuses.Revoked); + } } diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/OpenIddictDataSeedContributor.cs b/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/OpenIddictDataSeedContributor.cs index df8a88a9d3..326568475e 100644 --- a/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/OpenIddictDataSeedContributor.cs +++ b/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/OpenIddictDataSeedContributor.cs @@ -109,10 +109,10 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep { OpenIddictConstants.Permissions.Endpoints.Authorization, OpenIddictConstants.Permissions.Endpoints.Token, - OpenIddictConstants.Permissions.Endpoints.Device, + OpenIddictConstants.Permissions.Endpoints.DeviceAuthorization, OpenIddictConstants.Permissions.Endpoints.Introspection, OpenIddictConstants.Permissions.Endpoints.Revocation, - OpenIddictConstants.Permissions.Endpoints.Logout, + OpenIddictConstants.Permissions.Endpoints.EndSession, OpenIddictConstants.Permissions.GrantTypes.AuthorizationCode, OpenIddictConstants.Permissions.GrantTypes.Implicit, @@ -159,10 +159,10 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep { OpenIddictConstants.Permissions.Endpoints.Authorization, OpenIddictConstants.Permissions.Endpoints.Token, - OpenIddictConstants.Permissions.Endpoints.Device, + OpenIddictConstants.Permissions.Endpoints.DeviceAuthorization, OpenIddictConstants.Permissions.Endpoints.Introspection, OpenIddictConstants.Permissions.Endpoints.Revocation, - OpenIddictConstants.Permissions.Endpoints.Logout, + OpenIddictConstants.Permissions.Endpoints.EndSession, OpenIddictConstants.Permissions.GrantTypes.AuthorizationCode, OpenIddictConstants.Permissions.GrantTypes.Implicit, @@ -207,7 +207,7 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep { ApplicationId = _testData.App1Id.ToString(), AuthorizationId = _testData.Authorization1Id.ToString(), - Subject = "TestSubject1", + Subject = _testData.Subject1, Type = "TestType1", Status = OpenIddictConstants.Statuses.Redeemed, Payload = "TestPayload1", @@ -220,7 +220,7 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep { ApplicationId = _testData.App2Id.ToString(), AuthorizationId = _testData.Authorization1Id.ToString(), - Subject = "TestSubject2", + Subject = _testData.Subject2, Type = "TestType2", Status = OpenIddictConstants.Statuses.Valid, Payload = "TestPayload2", @@ -241,7 +241,7 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep { ApplicationId = _testData.App1Id.ToString(), Status = OpenIddictConstants.Statuses.Valid, - Subject = "TestSubject1", + Subject = _testData.Subject1, Type = OpenIddictConstants.AuthorizationTypes.Permanent, CreationDate = _clock.Now })); @@ -250,7 +250,7 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep { ApplicationId = _testData.App2Id.ToString(), Status = OpenIddictConstants.Statuses.Inactive, - Subject = "TestSubject2", + Subject = _testData.Subject2, Type = OpenIddictConstants.AuthorizationTypes.AdHoc, CreationDate = _clock.Now.AddDays(-30) })); diff --git a/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/OpenIddictTokenRepository_Tests.cs b/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/OpenIddictTokenRepository_Tests.cs index fe351e4301..5525f082eb 100644 --- a/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/OpenIddictTokenRepository_Tests.cs +++ b/modules/openiddict/test/Volo.Abp.OpenIddict.TestBase/Volo/Abp/OpenIddict/OpenIddictTokenRepository_Tests.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; using System.Threading.Tasks; using OpenIddict.Abstractions; using Shouldly; @@ -61,12 +62,12 @@ public abstract class OpenIddictTokenRepository_Tests : OpenIddi [Fact] public async Task FindAsync() { - (await _tokenRepository.FindAsync("TestSubject1", new Guid())).Count.ShouldBe(0); - (await _tokenRepository.FindAsync("TestSubject1", _testData.App1Id)).Count.ShouldBe(1); - (await _tokenRepository.FindAsync("TestSubject1", _testData.App1Id, "NonExistsStatus")).Count.ShouldBe(0); - (await _tokenRepository.FindAsync("TestSubject1", _testData.App1Id, OpenIddictConstants.Statuses.Redeemed)).Count.ShouldBe(1); - (await _tokenRepository.FindAsync("TestSubject1", _testData.App1Id, OpenIddictConstants.Statuses.Redeemed, "NonExistsType")).Count.ShouldBe(0); - (await _tokenRepository.FindAsync("TestSubject1", _testData.App1Id, OpenIddictConstants.Statuses.Redeemed, "TestType1")).Count.ShouldBe(1); + (await _tokenRepository.FindAsync( _testData.Subject1, new Guid())).Count.ShouldBe(0); + (await _tokenRepository.FindAsync( _testData.Subject1, _testData.App1Id)).Count.ShouldBe(1); + (await _tokenRepository.FindAsync( _testData.Subject1, _testData.App1Id, "NonExistsStatus")).Count.ShouldBe(0); + (await _tokenRepository.FindAsync( _testData.Subject1, _testData.App1Id, OpenIddictConstants.Statuses.Redeemed)).Count.ShouldBe(1); + (await _tokenRepository.FindAsync( _testData.Subject1, _testData.App1Id, OpenIddictConstants.Statuses.Redeemed, "NonExistsType")).Count.ShouldBe(0); + (await _tokenRepository.FindAsync( _testData.Subject1, _testData.App1Id, OpenIddictConstants.Statuses.Redeemed, "TestType1")).Count.ShouldBe(1); } [Fact] @@ -103,7 +104,7 @@ public abstract class OpenIddictTokenRepository_Tests : OpenIddi [Fact] public async Task FindBySubjectAsync() { - (await _tokenRepository.FindBySubjectAsync("TestSubject1")).Count.ShouldBe(1); + (await _tokenRepository.FindBySubjectAsync( _testData.Subject1)).Count.ShouldBe(1); } [Fact] @@ -122,4 +123,36 @@ public abstract class OpenIddictTokenRepository_Tests : OpenIddi (await _tokenRepository.ListAsync(int.MaxValue, 0)).Count.ShouldBe(1); } + + [Fact] + public async Task RevokeByApplicationIdAsync() + { + var authorizations = await _tokenRepository.FindByApplicationIdAsync(_testData.App2Id); + authorizations.Count.ShouldBe(1); + authorizations.First().ApplicationId.ShouldBe(_testData.App2Id); + authorizations.First().Status.ShouldBe(OpenIddictConstants.Statuses.Valid); + + (await _tokenRepository.RevokeByApplicationIdAsync(_testData.App2Id)).ShouldBe(1); + + authorizations = await _tokenRepository.FindByApplicationIdAsync(_testData.App2Id); + authorizations.Count.ShouldBe(1); + authorizations.First().ApplicationId.ShouldBe(_testData.App2Id); + authorizations.First().Status.ShouldBe(OpenIddictConstants.Statuses.Revoked); + } + + [Fact] + public async Task RevokeBySubjectAsync() + { + var authorizations = await _tokenRepository.FindBySubjectAsync(_testData.Subject2); + authorizations.Count.ShouldBe(1); + authorizations.First().Subject.ShouldBe(_testData.Subject2); + authorizations.First().Status.ShouldBe(OpenIddictConstants.Statuses.Valid); + + (await _tokenRepository.RevokeBySubjectAsync(_testData.Subject2)).ShouldBe(1); + + authorizations = await _tokenRepository.FindBySubjectAsync(_testData.Subject2); + authorizations.Count.ShouldBe(1); + authorizations.First().Subject.ShouldBe(_testData.Subject2); + authorizations.First().Status.ShouldBe(OpenIddictConstants.Statuses.Revoked); + } } diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server.Mongo/Data/OpenIddictDataSeedContributor.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server.Mongo/Data/OpenIddictDataSeedContributor.cs index 117aeeb123..8bbf2284f6 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server.Mongo/Data/OpenIddictDataSeedContributor.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server.Mongo/Data/OpenIddictDataSeedContributor.cs @@ -175,7 +175,7 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep if (!redirectUri.IsNullOrWhiteSpace() || !postLogoutRedirectUri.IsNullOrWhiteSpace()) { - application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Logout); + application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.EndSession); } var buildInGrantTypes = new [] @@ -235,7 +235,7 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep if (grantType == OpenIddictConstants.GrantTypes.DeviceCode) { application.Permissions.Add(OpenIddictConstants.Permissions.GrantTypes.DeviceCode); - application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Device); + application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints. DeviceAuthorization); } if (grantType == OpenIddictConstants.GrantTypes.Implicit) diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Data/OpenIddictDataSeedContributor.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Data/OpenIddictDataSeedContributor.cs index 117aeeb123..8bbf2284f6 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Data/OpenIddictDataSeedContributor.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Data/OpenIddictDataSeedContributor.cs @@ -175,7 +175,7 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep if (!redirectUri.IsNullOrWhiteSpace() || !postLogoutRedirectUri.IsNullOrWhiteSpace()) { - application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Logout); + application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.EndSession); } var buildInGrantTypes = new [] @@ -235,7 +235,7 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep if (grantType == OpenIddictConstants.GrantTypes.DeviceCode) { application.Permissions.Add(OpenIddictConstants.Permissions.GrantTypes.DeviceCode); - application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Device); + application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints. DeviceAuthorization); } if (grantType == OpenIddictConstants.GrantTypes.Implicit) diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/Data/OpenIddictDataSeedContributor.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/Data/OpenIddictDataSeedContributor.cs index 37ca7e6c12..39b651f211 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/Data/OpenIddictDataSeedContributor.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/Data/OpenIddictDataSeedContributor.cs @@ -174,7 +174,7 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep if (!redirectUri.IsNullOrWhiteSpace() || !postLogoutRedirectUri.IsNullOrWhiteSpace()) { - application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Logout); + application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.EndSession); } var buildInGrantTypes = new [] @@ -234,7 +234,7 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep if (grantType == OpenIddictConstants.GrantTypes.DeviceCode) { application.Permissions.Add(OpenIddictConstants.Permissions.GrantTypes.DeviceCode); - application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Device); + application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints. DeviceAuthorization); } if (grantType == OpenIddictConstants.GrantTypes.Implicit) diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Data/OpenIddictDataSeedContributor.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Data/OpenIddictDataSeedContributor.cs index 37ca7e6c12..39b651f211 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Data/OpenIddictDataSeedContributor.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Data/OpenIddictDataSeedContributor.cs @@ -174,7 +174,7 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep if (!redirectUri.IsNullOrWhiteSpace() || !postLogoutRedirectUri.IsNullOrWhiteSpace()) { - application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Logout); + application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.EndSession); } var buildInGrantTypes = new [] @@ -234,7 +234,7 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep if (grantType == OpenIddictConstants.GrantTypes.DeviceCode) { application.Permissions.Add(OpenIddictConstants.Permissions.GrantTypes.DeviceCode); - application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Device); + application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints. DeviceAuthorization); } if (grantType == OpenIddictConstants.GrantTypes.Implicit) diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/OpenIddict/OpenIddictDataSeedContributor.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/OpenIddict/OpenIddictDataSeedContributor.cs index f4aa9d708d..b65e024047 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/OpenIddict/OpenIddictDataSeedContributor.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/OpenIddict/OpenIddictDataSeedContributor.cs @@ -277,7 +277,7 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep if (!redirectUri.IsNullOrWhiteSpace() || !postLogoutRedirectUri.IsNullOrWhiteSpace()) { - application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Logout); + application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.EndSession); } var buildInGrantTypes = new[] { @@ -334,7 +334,7 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep if (grantType == OpenIddictConstants.GrantTypes.DeviceCode) { application.Permissions.Add(OpenIddictConstants.Permissions.GrantTypes.DeviceCode); - application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Device); + application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints. DeviceAuthorization); } if (grantType == OpenIddictConstants.GrantTypes.Implicit) diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/OpenIddict/OpenIddictDataSeedContributor.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/OpenIddict/OpenIddictDataSeedContributor.cs index 29b1751bee..5c4219e7ba 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/OpenIddict/OpenIddictDataSeedContributor.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/OpenIddict/OpenIddictDataSeedContributor.cs @@ -226,7 +226,7 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep if (!redirectUri.IsNullOrWhiteSpace() || !postLogoutRedirectUri.IsNullOrWhiteSpace()) { - application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Logout); + application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.EndSession); } var buildInGrantTypes = new [] @@ -286,7 +286,7 @@ public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDep if (grantType == OpenIddictConstants.GrantTypes.DeviceCode) { application.Permissions.Add(OpenIddictConstants.Permissions.GrantTypes.DeviceCode); - application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Device); + application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints. DeviceAuthorization); } if (grantType == OpenIddictConstants.GrantTypes.Implicit)