MCP-Server hinter dem Casdoor MCP-Gateway bereitstellen, End-to-End
Dieses Handbuch führt durch ein vollständiges Beispiel: Ein Unternehmen veröffentlicht einen MCP-Server für seine Mitarbeiter, die ihn von ChatGPT, Claude, Cursor und VS Code aus nutzen. Casdoor fungiert sowohl als Gateway vor dem Server als auch als Autorisierungsserver, der die Benutzer authentifiziert. Der MCP-Server selbst benötigt keinen OAuth 2.0-Code.
Lernziele
- Bereiten Sie eine Organisation so vor, dass sich MCP-Clients dort registrieren und anmelden können.
- Registrieren Sie einen MCP-Server in Casdoor und legen Sie fest, wer ihn nutzen darf und welche Tools verfügbar sind.
- Verbinden Sie die vier gängigen MCP-Clients.
- Bedienen Sie mehrere Organisationen von einer einzigen Casdoor-Instanz aus.
- Überprüfen, prüfen und widerrufen Sie Zugriffe.
Voraussetzungen
- Eine Casdoor-Instanz, die über HTTPS vom Internet aus erreichbar ist, beispielsweise
https://auth.example.com. ChatGPT- und Claude-custom Connectors rufen sie aus der Cloud auf. - Ein MCP-Server, der den Streamable HTTP Transport unterstützt, beispielsweise
https://tickets.example.com/mcp, optional geschützt durch ein statisches Bearer Token - Globaler Administratorzugriff auf die Casdoor-Admin-Konsole
Das Beispiel
Acme betreibt einen MCP-Server für sein Ticketsystem. Acme möchte:
- Mitarbeiter melden sich mit ihrem Acme-Konto an, über die Anmeldeverfahren, die Acme bereits in Casdoor eingerichtet hat.
- Nur das Support-Team darf den Server nutzen.
- Niemand darf das Tool
delete_ticketüber einen KI-Client aufrufen. - Der eigene API-Token des Servers verlässt niemals Casdoor.
- Ein Administrator kann jeden Client sehen und sperren.
Schritt 1: Die Organisation vorbereiten
- Wechseln Sie im Casdoor Admin Console zu User Management > Organizations und öffnen Sie
acme. - Aktivieren Sie Use organization issuer. Die Organisation wird zu einem eigenen Autorisierungsserver mit dem Issuer
https://auth.example.com/orgs/acmeund dem Discovery Documenthttps://auth.example.com/.well-known/oauth-authorization-server/orgs/acme. MCP-Clients, die dies entdecken, registrieren sich inacmeund authentifizieren Benutzer auf der Anmeldeseite vonacme. - Aktivieren Sie Enable dynamic client registration. Dies ermöglicht Clients, sich über ein Client-ID-Metadaten-Dokument (Claude, VS Code, ChatGPT) zu identifizieren oder sich selbst zu registrieren (Cursor, ältere Clients). Nur ein globaler Administrator kann diesen Schalter ändern.
- Speichern Sie die Organisation.
Ohne Use organization issuer gibt das Gateway den globalen Issuer von Casdoor als Autorisierungsserver an, und Clients registrieren sich in built-in. Aktivieren Sie dies für jede Organisation außer built-in, die MCP-Server veröffentlicht.
Schritt 2: Festlegen, wer den Server nutzen darf
Das Gateway lässt die Benutzer der Organisation des Servers zu, die sich bei der Anwendung des Servers anmelden dürfen.
- Wechseln Sie zu Identity > Applications und fügen Sie eine Anwendung in
acmehinzu, beispielsweiseapp-tickets. Es werden keine Redirect URLs benötigt: MCP-Clients melden sich nicht bei ihr an, sie trägt nur die Zugriffsregeln. - Um nur das Support-Team zuzulassen, wechseln Sie zu Authorization > Permissions und fügen Sie eine Berechtigung in
acmehinzu:- Resource type:
Application - Resources:
app-tickets - Groups or Roles: das Support-Team
- Actions:
Read, Effect:Allow
- Resource type:
Ohne Berechtigungen für die Anwendung darf jeder Benutzer von acme den Server nutzen. Administratoren von acme und globale Administratoren dürfen ihn immer nutzen.
Schritt 3: Den MCP-Server registrieren
-
Gehen Sie zu LLM AI > MCP Servers und fügen Sie einen Server in
acmehinzu:Feld Wert Name ticketsURL https://tickets.example.com/mcpApplication app-ticketsAccess token Das API-Token des Ticket-Servers, falls erforderlich -
Speichern Sie den Server und wählen Sie dann Sync unter Tool. Casdoor ruft die Tool-Liste des Servers ab.
-
Blockieren Sie
delete_ticketund speichern Sie. Das Gateway antwortet auf einen Aufruf eines blockierten Tools oder eines Tools, das nicht in der Liste enthalten ist, mit einer Fehlermeldung und leitet es nicht weiter. -
Kopieren Sie die Base URL:
https://auth.example.com/api/server/acme/tickets. Dies ist die URL, die Benutzer zu ihren MCP-Clients hinzufügen.
Das Gateway entfernt den Cookie-Header und den Authorization-Header des Benutzers aus jeder Anfrage und sendet stattdessen das Access token des Servers. Casdoor gibt das Token niemals in seinen API-Antworten zurück.
Für einen Server einer Organisation außer built-in muss die URL eine öffentliche Internetadresse sein: Das Gateway verweigert den Zugriff auf private und Loopback-Adressen im Namen eines Mandanten. Um einen MCP-Server in Ihrem internen Netzwerk zu veröffentlichen, registrieren Sie ihn in built-in.
Schritt 4: Die Discovery-Kette überprüfen
Jeder MCP-Client folgt derselben Kette. Prüfen Sie sie mit curl, bevor Sie einen Client verbinden:
curl -i -X POST https://auth.example.com/api/server/acme/tickets
Casdoor antwortet mit HTTP 401 und nennt die Metadaten der geschützten Ressource dieses Servers:
WWW-Authenticate: Bearer realm="casdoor", resource_metadata="https://auth.example.com/.well-known/oauth-protected-resource/api/server/acme/tickets"
curl https://auth.example.com/.well-known/oauth-protected-resource/api/server/acme/tickets
{
"resource": "https://auth.example.com/api/server/acme/tickets",
"authorization_servers": ["https://auth.example.com/orgs/acme"],
"bearer_methods_supported": ["header"],
"scopes_supported": ["openid", "profile", "email", "offline_access"]
}
curl https://auth.example.com/.well-known/oauth-authorization-server/orgs/acme
In diesem Dokument prüfen Sie:
issueristhttps://auth.example.com/orgs/acme, derselbe Wert wie inauthorization_servers.client_id_metadata_document_supportedisttrue, undregistration_endpointendet mit?organization=acme.token_endpoint_auth_methods_supportedenthältnone, undcode_challenge_methods_supportedenthältS256.
Schritt 5: Die Clients verbinden
Jeder Benutzer fügt die Gateway-URL seinem Client hinzu und meldet sich mit seinem Acme-Konto an.
| Client | Wo der Server hinzugefügt wird | Wie er sich identifiziert | Leitfaden |
|---|---|---|---|
| ChatGPT | Plugins > + > Add custom MCP server | CIMD https://chatgpt.com/oauth/client.json | ChatGPT verbinden |
| Claude Desktop, claude.ai | Customize > Connectors > Add custom connector | CIMD https://claude.ai/oauth/mcp-oauth-client-metadata | Claude verbinden |
| Claude Code | claude mcp add --transport http tickets <url> | CIMD https://claude.ai/oauth/claude-code-client-metadata | Claude verbinden |
| Cursor | ~/.cursor/mcp.json | DCR | Cursor verbinden |
| VS Code | .vscode/mcp.json | CIMD https://vscode.dev/oauth/client-metadata.json | VS Code verbinden |
Beispielsweise in Cursor:
{
"mcpServers": {
"tickets": {
"url": "https://auth.example.com/api/server/acme/tickets"
}
}
}
Und in VS Code:
{
"servers": {
"tickets": {
"type": "http",
"url": "https://auth.example.com/api/server/acme/tickets"
}
}
}
Ein Client, der ein Client-ID-Metadatendokument verwendet, erhält eine Anwendung in Casdoor, mit seiner URL als Client-ID, dem Tag cimd und einem Namen, der mit cimd_ beginnt. Ein Client, der sich selbst registriert, erhält eine Anwendung pro Registrierung, mit dem Tag dcr. Sie erstellen keine Anwendungen für die Clients.
Was den Server schützt
| Prüfung | Wo | Was passiert sonst |
|---|---|---|
Das Token gehört zu einem Benutzer von acme | Gateway | HTTP 401 |
Der Benutzer darf sich bei app-tickets anmelden | Gateway | HTTP 401 |
| Das Token wurde für diesen Server ausgestellt (RFC 8707) | Gateway | HTTP 401: "The access token is for another resource" |
| Das Tool ist in der Liste und erlaubt | Gateway | JSON-RPC-Fehler, der Aufruf wird nicht weitergeleitet |
| Der Client ist ein selbst registrierter Client | Jede API | Seine Tokens können nur den Anmeldeablauf, /api/userinfo, /api/mcp und /api/server/* aufrufen, niemals die Management-APIs |
Clients fordern das Token mit resource=https://auth.example.com/api/server/acme/tickets an, und Casdoor setzt diese URL in die aud-Claim. Ein Token für einen anderen MCP-Server, auch wenn er zur selben Organisation gehört, funktioniert hier nicht, so dass ein bösartiger Server die empfangenen Tokens nicht wiederverwenden kann.
Mehrere Organisationen bedienen
Eine Casdoor-Instanz kann MCP-Server für viele Organisationen veröffentlichen, z. B. für die Kunden eines SaaS-Anbieters. Wiederholen Sie die Schritte 1 bis 3 für jede Organisation. Dann:
- Jede Organisation hat ihren eigenen Issuer, ihre eigene Anmeldeseite, Benutzer und Berechtigungen. Ein Benutzer von
globexkann sich nicht auf der Seite vonacmeanmelden und die Server vonacmenicht nutzen. - Die Metadaten-Dokumente der Client-IDs von ChatGPT, Claude und VS Code haben jeweils eine URL, die von allen Organisationen genutzt wird. Casdoor verwaltet pro URL eine gemeinsame Anwendung in
built-inund stellt sie als Anwendung der Organisation bereit, bei der sich der Benutzer anmeldet. Jede Organisation muss dennoch Enable dynamic client registration aktivieren, um diese Clients zu akzeptieren. - Tokens enthalten den Issuer der Organisation des Benutzers, auch nach einer Aktualisierung (Refresh).
- Ein selbst registrierter Client (DCR) registriert sich in der Organisation des Discovery-Dokuments über den Parameter
organizationdes Registrierungsendpunkts.
Überprüfen, prüfen und widerrufen
- Clients: Unter Identity > Applications werden Clients mit den Tags
cimdunddcraufgelistet. Löschen Sie einedcr_-Anwendung, um eine Registrierung zu entfernen. - Tokens: Unter Auditing > Tokens wird jedes Token mit seinem Benutzer, seiner Anwendung, dem Scope und der Ressource aufgelistet. Löschen Sie ein Token, um einen Client sofort zu sperren.
- Users: Sperren Sie einen Benutzer, und seine Tokens funktionieren am Gateway ab der nächsten Anfrage nicht mehr.
- Tools: Blockieren Sie ein Tool auf der Bearbeitungsseite des Servers. Die Änderung tritt beim nächsten Aufruf in Kraft.
Unternehmensbenutzern das Überspringen des Browsers ermöglichen
Wenn sich die Mitarbeiter einer Organisation über einen Enterprise-Identitätsanbieter wie Okta anmelden, können Clients, die Enterprise-Managed Authorization unterstützen (Claude Team und Enterprise), das Gateway-Token ohne Browser-Anmeldung erhalten: Der Identitätsanbieter stellt ein ID-JAG aus, und Casdoor tauscht es gegen ein Access Token. Siehe Enterprise-managed authorization.
Fehlerbehebung
Das Gateway antwortet nach der Anmeldung mit 401
- Der Server hat keine Application. Ohne eine solche dürfen nur Administratoren den Server nutzen. Wählen Sie eine Anwendung aus, siehe Schritt 2.
- Eine Berechtigung auf der Anwendung schließt den Benutzer aus.
- Der Benutzer gehört einer anderen Organisation an als der Server.
- Der Client hat das Token für eine andere Ressource angefordert. Überprüfen Sie den
aud-Claim des Tokens: Es muss die Gateway-URL sein.
Der Client meldet Benutzer in der falschen Organisation an
Use organization issuer ist deaktiviert, sodass die Metadaten der geschützten Ressource den globalen Issuer nennen. Aktivieren Sie dies und verbinden Sie den Client erneut.
"client ID metadata documents are not accepted"
Enable dynamic client registration ist für die Organisation deaktiviert. Casdoor muss zudem über das Internet auf die Dokument-URL des Clients zugreifen können.
Das Gateway antwortet mit 502
Casdoor kann die URL des Servers nicht erreichen. Überprüfen Sie die URL und stellen Sie sicher, dass sie für Organisationen außer built-in eine öffentliche Adresse ist.