mirror of
https://github.com/okieselbach/AutopilotMonitor.git
synced 2026-10-24 04:32:32 +00:00
c59b366560
A user token obtained by an application other than the platform's own registrations (for example a self-hosted AI client using on-behalf-of) was accepted with the user's full role; only audience, issuer, signature and lifetime were checked. Such tokens are now classified on every request. - ClientAppBindingMiddleware (after authentication, before policy enforcement) records the request dimensions ClientAppBinding (registered | unregistered | unidentified) and ClientAppId, plus a throttled Warning. - AdminConfiguration.EnforceClientAppBinding (default off; Admin > Settings > Global): when on, a foreign client is refused with 403 ClientAppNotRegistered unless the application is an enabled member of the caller's tenant (the app:<client-id> row a service principal uses). An admitted caller keeps their identity but gets the application caps: at most Viewer, no platform role, DelegatedReader on managed tenants, roleless tiers closed except auth/mcp. - AdminIdentity.IsCapped (application or admitted foreign client) is what the global, delegated and member-role resolvers switch on; RequestContext carries it. - Own clients = the audience trust set plus EntraId:TrustedClientAppIds, a client-only trust for the local development registration that never widens the accepted audiences. - Tests: classification, unforgeable cap marker, middleware in both modes, caps through the real policy middleware, pipeline order; manifests and wire types regenerated. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>