diff --git a/src/OpenIddict.Abstractions/Descriptors/OpenIddictApplicationDescriptor.cs b/src/OpenIddict.Abstractions/Descriptors/OpenIddictApplicationDescriptor.cs
index 741002e1..114b0878 100644
--- a/src/OpenIddict.Abstractions/Descriptors/OpenIddictApplicationDescriptor.cs
+++ b/src/OpenIddict.Abstractions/Descriptors/OpenIddictApplicationDescriptor.cs
@@ -102,6 +102,27 @@ public class OpenIddictApplicationDescriptor
return this;
}
+ ///
+ /// Adds grant type permissions for all the specified .
+ ///
+ /// The grant types for which grant types permissions will be added.
+ /// The instance.
+ /// is .
+ public OpenIddictApplicationDescriptor AddGrantTypePermissions(params string[] types)
+ {
+ if (types is null)
+ {
+ throw new ArgumentNullException(nameof(types));
+ }
+
+ foreach (var type in types)
+ {
+ Permissions.Add(OpenIddictConstants.Permissions.Prefixes.GrantType + type);
+ }
+
+ return this;
+ }
+
///
/// Adds resource permissions for all the specified .
///
@@ -333,6 +354,27 @@ public class OpenIddictApplicationDescriptor
return this;
}
+ ///
+ /// Removes all the grant type permissions corresponding to the specified .
+ ///
+ /// The grant types for which grant types permissions will be removed.
+ /// The instance.
+ /// is .
+ public OpenIddictApplicationDescriptor RemoveGrantTypePermissions(params string[] types)
+ {
+ if (types is null)
+ {
+ throw new ArgumentNullException(nameof(types));
+ }
+
+ foreach (var type in types)
+ {
+ Permissions.Remove(OpenIddictConstants.Permissions.Prefixes.GrantType + type);
+ }
+
+ return this;
+ }
+
///
/// Removes all the resource permissions corresponding to the specified .
///
diff --git a/test/OpenIddict.Abstractions.Tests/Descriptors/OpenIddictApplicationDescriptorTests.cs b/test/OpenIddict.Abstractions.Tests/Descriptors/OpenIddictApplicationDescriptorTests.cs
index f29e9e6d..1f877100 100644
--- a/test/OpenIddict.Abstractions.Tests/Descriptors/OpenIddictApplicationDescriptorTests.cs
+++ b/test/OpenIddict.Abstractions.Tests/Descriptors/OpenIddictApplicationDescriptorTests.cs
@@ -29,6 +29,30 @@ public class OpenIddictApplicationDescriptorTests
Assert.Throws(() => descriptor.AddAudiencePermissions(null!));
}
+ [Fact]
+ public void AddGrantTypePermissions_AddsPermissions()
+ {
+ // Arrange
+ var descriptor = new OpenIddictApplicationDescriptor();
+
+ // Act
+ descriptor.AddGrantTypePermissions(GrantTypes.Implicit, "custom_grant_type");
+
+ // Assert
+ Assert.Contains(OpenIddictConstants.Permissions.Prefixes.GrantType + GrantTypes.Implicit, descriptor.Permissions);
+ Assert.Contains(OpenIddictConstants.Permissions.Prefixes.GrantType + "custom_grant_type", descriptor.Permissions);
+ }
+
+ [Fact]
+ public void AddGrantTypePermissions_ThrowsAnExceptionForNullGrantTypes()
+ {
+ // Arrange
+ var descriptor = new OpenIddictApplicationDescriptor();
+
+ // Act and assert
+ Assert.Throws(() => descriptor.AddGrantTypePermissions(null!));
+ }
+
[Fact]
public void AddResourcePermissions_AddsPermissions()
{
@@ -270,6 +294,31 @@ public class OpenIddictApplicationDescriptorTests
Assert.Throws(() => descriptor.RemoveAudiencePermissions(null!));
}
+ [Fact]
+ public void RemoveGrantTypePermissions_RemovesPermissions()
+ {
+ // Arrange
+ var descriptor = new OpenIddictApplicationDescriptor();
+ descriptor.AddGrantTypePermissions(GrantTypes.Implicit, "custom_grant_type");
+
+ // Act
+ descriptor.RemoveGrantTypePermissions(GrantTypes.Implicit);
+
+ // Assert
+ Assert.DoesNotContain(GrantTypes.Implicit, descriptor.Permissions);
+ Assert.Contains(OpenIddictConstants.Permissions.Prefixes.GrantType + "custom_grant_type", descriptor.Permissions);
+ }
+
+ [Fact]
+ public void RemoveGrantTypePermissions_ThrowsAnExceptionForNullGrantTypes()
+ {
+ // Arrange
+ var descriptor = new OpenIddictApplicationDescriptor();
+
+ // Act and assert
+ Assert.Throws(() => descriptor.RemoveGrantTypePermissions(null!));
+ }
+
[Fact]
public void RemoveResourcePermissions_RemovesPermissions()
{