Skip to content

[ARAP] evaluation_id-only binding path contradicts stateless PDP design goal #516

@vatsalgupta

Description

@vatsalgupta

The spec states as a design goal:

[ARAP] evaluation_id-only binding path contradicts stateless PDP design goal "Preserve the AuthZEN Authorization API's stateless evaluation

model: the PDP retains no decision state between the denial and
the re-evaluation, and the durable request and approval state
lives in the Access Request Service role."

But the Access Request Service processing rules say:

"the service MUST resolve or validate denial.evaluation_id,
retrieve the Subject, Resource, Action, authorization-relevant
Context, and expires_at the PDP recorded for that
evaluation"

For the ARS to retrieve what the PDP recorded, that data has to
be stored somewhere. A stateless PDP stores nothing. An
independent ARS has no access to it and there is no defined API
to fetch it.

This came up in a WG call (Omri flagged it) but there is no
issue tracking it yet.

The binding_token path does not have this problem. The PDP
signs and forgets. The ARS verifies the signature. No stored
state needed. But binding_token is OPTIONAL, and the spec
treats the evaluation_id-only path as equally valid. That only
works when the PDP and ARS share state, which is not the
independent ARS topology the spec is trying to enable.

Options

Option A: Require binding_token when the ARS is
independent of the PDP. The evaluation_id-only path becomes
limited to same-service or shared-state deployments. No protocol
changes needed, just a clarification of when each path applies.

Option B: Define a mechanism for the PDP to push evaluation
records to the ARS at denial time. This preserves the
evaluation_id-only path for independent deployments but adds
a new API surface.

Option C: Drop the stateless design goal as it applies to
the evaluation_id path and explicitly document the state
requirements. Honest but weakens the spec's alignment with
base AuthZEN.

Option A seems like the right call. The binding_token path
already solves the stateless case cleanly.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions