You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
PR #5121 added GroupEntityType to cedar.ConfigOptions so deployments can configure the entity type the Cedar authorizer uses when building principal parent UIDs from JWT group/role claims. GroupClaimName and RoleClaimName were already present. All three fields are read from authz.json at runtime by MCPServer and MCPRemoteProxy, which load the file directly via LoadConfig() → ConfigOptions.
The enterprise controller writes all three into authz.json:
GroupEntityType, GroupClaimName, and RoleClaimName are absent. The operator converter (pkg/vmcpconfig/converter.go) builds this struct manually for both the inline and ConfigMap paths, and has nowhere to put these values. They are silently dropped.
As a result, the Cedar authorizer inside the vmcp binary is always constructed with:
GroupEntityType defaulting to "THVGroup" (the upstream hardcoded legacy value)
GroupClaimName defaulting to the well-known fallback list (groups, roles, cognito:groups)
RoleClaimName empty
For deployments using the enterprise controller, the static entity store uses ClaimGroup entities. Because GroupEntityType is never forwarded, the runtime Cedar authorizer builds THVGroup:: parents for the principal while the static entity store has ClaimGroup:: entities — severing the Client → ClaimGroup → PlatformRole hierarchy. Cedar in checks silently evaluate to false and all group/role-scoped policies deny.
This affects both the inline path today and the ConfigMap path once #5208 lands.
Fix
Add GroupEntityType, GroupClaimName, and RoleClaimName to pkg/vmcp/config/config.go's AuthzConfig struct.
Wire them through the Cedar authorizer factory so the vmcp binary passes them to NewCedarAuthorizer via ConfigOptions.
A VirtualMCPServer with Cedar group/role policies enforces them correctly at runtime
group_entity_type, group_claim_name, and role_claim_name from an enterprise authz.json ConfigMap are forwarded into the vmcp config.yaml and reach the Cedar authorizer
Background
PR #5121 added
GroupEntityTypetocedar.ConfigOptionsso deployments can configure the entity type the Cedar authorizer uses when building principal parent UIDs from JWT group/role claims.GroupClaimNameandRoleClaimNamewere already present. All three fields are read fromauthz.jsonat runtime by MCPServer and MCPRemoteProxy, which load the file directly viaLoadConfig()→ConfigOptions.The enterprise controller writes all three into
authz.json:{ "cedar": { "group_entity_type": "ClaimGroup", "group_claim_name": "groups", "role_claim_name": "roles" } }Problem
The vmcp internal
AuthzConfigstruct (pkg/vmcp/config/config.go) only carries:GroupEntityType,GroupClaimName, andRoleClaimNameare absent. The operator converter (pkg/vmcpconfig/converter.go) builds this struct manually for both the inline and ConfigMap paths, and has nowhere to put these values. They are silently dropped.As a result, the Cedar authorizer inside the vmcp binary is always constructed with:
GroupEntityTypedefaulting to"THVGroup"(the upstream hardcoded legacy value)GroupClaimNamedefaulting to the well-known fallback list (groups,roles,cognito:groups)RoleClaimNameemptyFor deployments using the enterprise controller, the static entity store uses
ClaimGroupentities. BecauseGroupEntityTypeis never forwarded, the runtime Cedar authorizer buildsTHVGroup::parents for the principal while the static entity store hasClaimGroup::entities — severing theClient → ClaimGroup → PlatformRolehierarchy. Cedarinchecks silently evaluate to false and all group/role-scoped policies deny.This affects both the inline path today and the ConfigMap path once #5208 lands.
Fix
GroupEntityType,GroupClaimName, andRoleClaimNametopkg/vmcp/config/config.go'sAuthzConfigstruct.NewCedarAuthorizerviaConfigOptions.authz.jsonand populate them intoAuthzConfig.InlineAuthzConfig(CRD change), or lift them toAuthzConfigRefas part of vMCP: Load authz config from ConfigMap (policies + primaryUpstreamProvider) #5208's Option B schema decision — the approach should be coordinated with that issue.Related
GroupEntityTypetoConfigOptions(the receiving end this issue completes for vMCP)Acceptance criteria
group_entity_type,group_claim_name, androle_claim_namefrom an enterpriseauthz.jsonConfigMap are forwarded into the vmcpconfig.yamland reach the Cedar authorizer