Saltar al contenido principal

Autorización gestionada por la empresa con ID-JAG

Esta guía explica Enterprise-Managed Authorization, una extensión de la especificación de autorización MCP para empresas: el proveedor de identidad empresarial (IdP) decide qué servidores MCP puede usar un empleado, y el cliente MCP obtiene sus tokens sin iniciar sesión en el navegador en cada servidor. Casdoor asume cualquiera de los dos roles:

  • El servidor de autorización de los servidores MCP: Casdoor acepta los ID-JAGs de un IdP empresarial en el que confía una organización.
  • El IdP empresarial: Casdoor emite ID-JAGs para servidores MCP cuyo servidor de autorización confía en él.

Resultados del aprendizaje​

  • Entender el flujo y qué es un ID-JAG.
  • Permitir que una organización de Casdoor confíe en los ID-JAGs de un IdP empresarial.
  • Emitir ID-JAGs desde Casdoor.

Requisitos​

  • Acceso de administrador global a la consola de administración de Casdoor
  • Un cliente MCP que admita la extensión, por ejemplo Claude Team o Enterprise con Okta Cross App Access

Cómo funciona​

Un ID-JAG (Identity Assertion JWT Authorization Grant) es un JWT de corta duración firmado por el IdP. Indica: este usuario puede usar este cliente en este servidor de autorización. Está definido en draft-ietf-oauth-identity-assertion-authz-grant, y la extensión MCP io.modelcontextprotocol/enterprise-managed-authorization se basa en ello. Consulte Enterprise-Managed Authorization.

El usuario nunca ve la página de inicio de sesión de Casdoor. Cuando el IdP detiene al usuario, por ejemplo después de dejar la empresa, el cliente no recibe ningún nuevo ID-JAG, ni ningún nuevo token de acceso.

Aceptar ID-JAGs en Casdoor​

Confiar en el IdP​

  1. En la consola de administración de Casdoor, vaya a User Management > Organizations y abra la organización de los usuarios, por ejemplo acme.

  2. Opcionalmente, active Use organization issuer, para que la organización tenga su propio emisor, https://your-casdoor.com/orgs/acme. De lo contrario, el emisor es el global, https://your-casdoor.com.

  3. En Trusted ID-JAG issuers, añada una fila:

    ColumnValue
    IssuerEl iss de los ID-JAGs, por ejemplo https://acme.okta.com
    JWKS URLEl conjunto de claves del IdP. Si lo deja vacío, Casdoor lee jwks_uri de <issuer>/.well-known/openid-configuration
    UserCómo encontrar al usuario en la organización: {email} (el predeterminado) toma la reclamación email, {sub} la reclamación sub, cualquier {claim} esa reclamación. Casdoor lo compara con el nombre de usuario, email, teléfono e ID
  4. Guarde la organización. Solo un administrador global puede cambiar los emisores de confianza.

En el IdP, dé a Casdoor el emisor de la organización como audiencia de los ID-JAGs, y las URLs del servidor MCP como recursos. Para un servidor detrás del MCP gateway, eso es https://your-casdoor.com/api/server/acme/<server-name>.

Dejar que el cliente use la concesión​

El cliente canjea el ID-JAG en el endpoint de token con la concesión JWT bearer (urn:ietf:params:oauth:grant-type:jwt-bearer), por lo que el tipo de concesión debe estar permitido para su aplicación:

  • Claude: Su documento de metadatos del ID de cliente https://claude.ai/oauth/mcp-oauth-client-metadata enumera la concesión. Active Enable dynamic client registration para la organización, para que Casdoor acepte el documento. Consulte Connect Claude.
  • Una aplicación que usted cree: Añada JWT Bearer a sus Grant types.

Lo que envía el cliente​

curl -X POST https://your-casdoor.com/api/login/oauth/access_token \
-d grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer \
-d client_id=<client-id> \
-d client_secret=<client-secret> \
-d assertion=<ID-JAG>

Casdoor responde con un token de acceso cuya audiencia es el resource del ID-JAG:

{
"access_token": "eyJhbGciOiJSUzI1NiIs...",
"token_type": "Bearer",
"expires_in": 604800,
"scope": "openid profile"
}

Lo que comprueba Casdoor​

ComprobaciónRegla
TipoLa cabecera JWT tiene typ: oauth-id-jag+jwt. Otras aserciones pasan por la concesión JWT bearer ordinaria
ClienteUn cliente confidencial se autentica, con su secreto de cliente o private_key_jwt. Un cliente público de un documento de metadatos del ID de cliente, como Claude, no tiene secreto y solo envía client_id
Audienciaaud es el emisor de una organización con su propio emisor, o el emisor global, que representa la organización de la aplicación del cliente
Emisor y firmaiss es un emisor de confianza de esa organización, y la clave con el kid de la cabecera en su JWKS verifica la firma
Vigenciaexp e iat están presentes y son válidos, con un minuto de tolerancia
Vinculación de clienteclient_id es igual al ID de cliente del cliente que lo canjea
Uso únicoCasdoor acepta cada jti de un emisor una sola vez
UsuarioEl usuario encontrado a través de User existe en la organización, no está prohibido y puede iniciar sesión en la aplicación del cliente
ÁmbitoUn scope en la solicitud debe ser un subconjunto del scope del ID-JAG. Sin uno, el token obtiene el ámbito del ID-JAG
Recursoresource, cuando está presente, se convierte en la audiencia del token de acceso

Un cliente que se registró a sí mismo (DCR) o usa un documento de metadatos del ID de cliente solo puede usar la concesión JWT bearer con un ID-JAG.

Errores​

ErrorCause
invalid_clientUn cliente confidencial no se autenticó
invalid_grantEl ID-JAG falló una de las comprobaciones: audiencia incorrecta, emisor no confiable, firma mala, expirado, emitido para otro cliente, usado antes, o el usuario no existe
invalid_scopeLa solicitud pide un ámbito que el ID-JAG no concede
invalid_targetEl resource del ID-JAG no es una URI absoluta
unsupported_grant_typeJWT Bearer no está entre los tipos de concesión de la aplicación del cliente

Los metadatos del servidor de autorización anuncian el soporte: grant_types_supported contiene urn:ietf:params:oauth:grant-type:jwt-bearer, y authorization_grant_profiles_supported contiene urn:ietf:params:oauth:grant-profile:id-jag.

Emitir ID-JAG desde Casdoor​

Cuando Casdoor es el IdP de la empresa, un cliente intercambia el token de identidad del usuario por un ID-JAG en el endpoint de tokens de Casdoor, mediante intercambio de tokens (RFC 8693):

curl -X POST https://your-casdoor.com/api/login/oauth/access_token \
-d grant_type=urn:ietf:params:oauth:grant-type:token-exchange \
-d client_id=<client-id> \
-d client_secret=<client-secret> \
-d requested_token_type=urn:ietf:params:oauth:token-type:id-jag \
-d subject_token=<ID token of the user> \
-d subject_token_type=urn:ietf:params:oauth:token-type:id_token \
-d audience=https://mcp-as.example.com \
-d resource=https://mcp.example.com/mcp \
-d scope="openid profile"
{
"issued_token_type": "urn:ietf:params:oauth:token-type:id-jag",
"access_token": "eyJ0eXAiOiJvYXV0aC1pZC1qYWcrand0Ii...",
"token_type": "N_A",
"expires_in": 300,
"scope": "openid profile"
}

Configúrelo de la siguiente manera:

  1. Agregue Token Exchange a los Grant types de la aplicación del cliente.
  2. Registre el servidor MCP en la página LLM AI > MCP Servers de la organización del usuario, con su URL como resource, y seleccione una Application que lo represente. Sin un resource, Casdoor encuentra la aplicación mediante el audience, ya sea como ID de cliente o nombre de aplicación.
  3. Conceda acceso a los usuarios: agregue un permiso con Resource type Application, la aplicación del servidor como recurso, y Effect Allow. Casdoor emite un ID-JAG solo a un usuario cubierto por un permiso Allow, por lo que una aplicación a la que nadie tiene acceso permanece cerrada.

El ID-JAG es válido durante 5 minutos. Su aud es el audience de la solicitud, client_id es el ID de cliente de la aplicación solicitante, y lleva el email del usuario, el resource y el scope. El servidor de autorización del servidor MCP debe confiar en el emisor de Casdoor, y el cliente debe usar el mismo ID de cliente allí, por ejemplo, la URL de su documento de metadatos de ID de cliente.

Véase también​