apereo/cas · error
Ticket [ ] is not registered in the catalog and is…
Error message
Ticket [{}] is not registered in the catalog and is unrecognized What it means
GeodeTicketRegistry.getTicket() encodes the ticket id, then looks up its metadata in the ticket catalog. If no catalog entry exists for that ticket id prefix, the registry cannot determine which Geode cache region to query; it logs this warning and returns null. Callers should treat the ticket as expired/unknown (InvalidTicketException downstream).
Solutions
- Register the ticket definition for the id prefix via the ticket catalog configuration
- Check that the ticket id being resolved is well-formed and originates from this CAS deployment
- Enable trace logging to inspect the encoded id being looked up and compare its prefix to catalog entries
Example fix
// before: custom ticket never registered
// custom XYZ- prefix missing from catalog
// after
@Override
protected void addTicketToCatalog(final DefaultTicketDefinitionBuilder builder) {
builder.buildAndRegisterTicketDefinition(this.catalog, "XYZ", XyzTicket.class, PolicyMethod.ATTRIBUTE);
} Defensive patterns
Strategy: validation
Validate before calling
var metadata = ticketCatalog.find(ticketId);
if (metadata == null) {
LOGGER.warn("Unknown ticket id prefix: {}", ticketId);
} Type guard
boolean isKnownTicket(var catalog, String id) { return id != null && catalog.find(id) != null; } Try / catch
try {
Ticket t = ticketRegistry.getTicket(ticketId, TicketGrantingTicket.class);
} catch (InvalidTicketException e) {
handleUnknownOrExpiredTicket(ticketId);
} Prevention
- Register every custom ticket type in the ticket catalog
- Never fabricate ticket ids outside the CAS ticket-granting flow
- Handle null/InvalidTicket results as session-expired rather than retrying
When it happens
Trigger: getTicket(ticketId) called with an id whose prefix (e.g. TGT-, ST-, PGT-) has no registered ticket definition in the catalog - malformed ticket ids, custom ticket types not registered, or ids passed with the wrong prefix/case.
Common situations: Client sends a ticket id from a different CAS deployment with different ticket definitions; custom ticket types added to the registry but not the catalog; truncated or hand-crafted ticket strings in test scripts.
Understand the failure class
Background: Record Not Found Errors: "not found", RecordNotFound, and "was not found" — what they mean and how to fix them — this error's family across 28 libraries.
Related errors
- No ticket definition could be found in the catalog to match
- Ticket [ ] is not registered in the catalog and is…
- No authentication found for ticket
- Invalid token:
- Invalid token:
AI-assisted analysis of apereo/cas@e7288fc434 (2026-09-08).
Data as JSON: /api/errors/2a7917d428450956.
Report an issue: GitHub.
Appendix: source
Thrown at support/cas-server-support-geode-ticket-registry/src/main/java/org/apereo/cas/ticket/registry/GeodeTicketRegistry.java:127
val query = cache.cache().getQueryService().newQuery(queryString);
val digestedId = digestIdentifier(principalId);
val results = (Collection<String>) query.execute(digestedId);
cache.region().removeAll(results);
return results.size();
}))
.sum();
}
@Override
public Ticket getTicket(final String ticketIdToGet, final Predicate<Ticket> predicate) {
val ticketId = digestIdentifier(ticketIdToGet);
if (StringUtils.isBlank(ticketId)) {
return null;
}
LOGGER.debug("Encoded ticket id is [{}]", ticketId);
val metadata = ticketCatalog.find(ticketIdToGet);
if (metadata == null) {
LOGGER.warn("Ticket [{}] is not registered in the catalog and is unrecognized", ticketIdToGet);
return null;
}
val cache = getCacheFromMetadata(metadata);
LOGGER.trace("Located cache region [{}] for ticket id [{}]", cache.region().getName(), ticketId);
val ticket = cache.region().get(ticketId);
LOGGER.trace("Located ticket from cache for ticket id [{}] is [{}]", ticketId, ticket);
if (ticket == null) {
LOGGER.debug("No ticket by id [{}] is found in the ignite ticket registry", ticketId);
return null;
}
val result = decodeTicket(ticket.getTicket());
return predicate.test(result) ? result : null;
}
@Override
public Collection<? extends Ticket> getTickets() {
try (val stream = stream()) {
return stream.collect(Collectors.toSet());View on GitHub (pinned to e7288fc434)