diff --git a/Makefile b/Makefile
index ed3edf87a0f100a4896f3684f1042ff5149d52e4..7e571cc4c102c9a5fe643aba301db76a5b6f65cc 100644
--- a/Makefile
+++ b/Makefile
@@ -18,6 +18,9 @@ create_oidc_client.dashboard:
 create_oidc_client.tank:
 	$(POETRY_RUN_MANAGE) create_oidc_client tank confidential --client-id ${TANK_OIDC_CLIENT_ID} --client-secret ${TANK_OIDC_CLIENT_SECRET} -r "code" -u ${TANK_CALLBACK_BASE_URL}/tank/auth/oidc/callback
 
+delete_oidc_clients:
+	$(POETRY_RUN_MANAGE) delete_oidc_clients dashboard tank
+
 initialize: migrate collectstatic create_oidc_client.dashboard create_oidc_client.tank addpermissions
 	$(POETRY_RUN_MANAGE) createsuperuser --no-input
 	$(POETRY_RUN_MANAGE) creatersakey
diff --git a/program/management/commands/delete_oidc_clients.py b/program/management/commands/delete_oidc_clients.py
new file mode 100644
index 0000000000000000000000000000000000000000..22c46f2112486c6905f07fe696a16dcd347c71c7
--- /dev/null
+++ b/program/management/commands/delete_oidc_clients.py
@@ -0,0 +1,26 @@
+from oidc_provider.models import Client
+
+from django.core.management.base import BaseCommand
+
+
+class Command(BaseCommand):
+    help = "Deletes OIDC clients"
+
+    def add_arguments(self, parser):
+        parser.add_argument(
+            "name",
+            help="The name(s) of the OIDC client(s) to delete",
+            nargs="*",
+            type=str,
+        )
+
+    def handle(self, *args, **options):
+        try:
+            count, _ = Client.objects.filter(name__in=options["name"]).delete()
+        except Exception:
+            self.stdout.write(self.style.ERROR("Failed to delete OIDC clients"))
+        else:
+            if count > 0:
+                self.stdout.write(self.style.SUCCESS(f"Deleted {str(count)} OIDC clients"))
+            else:
+                self.stdout.write(self.style.WARNING("No OIDC clients to delete"))