I have a portal application that loads external content (widgets) via an iframe. Users login to CAS via the portal itself. There are a few portal APIs, though, that need to be called from that external content. What information do I have to pass from the portal to the widgets that the widgets can use to make these calls without being rejected by CAS?
UPDATE
The more I investigate, the more I think that my question boils down to how CAS actually does what it’s supposed to do. In other words, how can I go from one site where I’ve authenticated to another and tell it that I’ve already done the authentication thing. What’s the mechanism behind that and how can I employ in in a web context.
The portal scenario you describe is exactly what CAS’ proxy ticketing was designed for. We use it with an iframe-based web portal system and it works fine.
The CAS proxy ticketing mechanism allows a client (your portal) to dish out service tickets to other clients (the widgets loaded in your portal’s iframes). This saves your users a trip through the CAS server for each widget that their browser loads. Proxing is also useful if you’re trying to use CAS for web service authentication (i.e. when one web service needs to connect to another CAS-protected web service).
Note though that for your purpose proxy ticketing isn’t actually necessary. Your portal-iframe setup should work without it. But without proxy ticketing, each widget will have to go through the CAS server as it loads. At the very least this would slow down load times.
A while back I wrote a guide for setting up CAS proxy ticketing for RubyCAS-Client. The instructions are specific to the Ruby client, but they should give you a good overview of how CAS proxying works. Admittedly the implementation is a bit complicated — mostly due to the “Proxy Granting Ticket” negotiation process:
http://rubycas-client.rubyforge.org/files/README_txt.html
(scroll down to the “How to act as a CAS proxy” section about 2/3rd down)