openid / openid/authzen

Support for Indeterminate Decision / Evaluation Status in Authorization Responses

Open
#456 2 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
TypeScript
Stars
160
Forks
41
Avg merge
2d 3h
Merged PRs (30d)
23

Description

AuthZEN responses currently require a boolean decision (allow / deny), with optional context for additional information.
In practice, there are cases where the PDP cannot complete evaluation, for example:

  • attribute source unavailable
  • external risk signal unavailable
  • missing required context

Today, these are typically represented as:

{
  "decision": false,
  "context": {
    "error": "risk_engine_unavailable"
  }
}

This makes it difficult to distinguish between:

  • Deny → policy evaluated and access is not allowed

  • Evaluation failure → system could not determine the correct outcome

    Both appear as deny at the decision level.

Why This Matters
  1. Enforcement Semantics
    Policy Enforcement Points (PEPs) may need to react differently:
  • Deny → block request

  • Indeterminate → retry, fallback, step-up auth, or degrade access

    Without a standard signal, each PEP must interpret context independently.

  1. Interoperability
    The specification currently allows context to carry arbitrary information, but:
    Its semantics are implementation-specific
  • PEP behavior is not standardized
  • Cross-vendor interoperability is limited
  1. Audit and Explainability
    From a governance and audit perspective, it is important to distinguish:
  • “Access denied due to policy”

  • “Access denied due to system failure or missing data”

    Collapsing both into deny reduces audit clarity and can lead to misleading conclusions.

  1. Alignment with Existing Models
    Other authorization systems explicitly model evaluation uncertainty:
    XACML: Permit / Deny / Indeterminate / NotApplicable
    Many policy engines (e.g., OPA) distinguish between decision and evaluation failure
    AuthZEN currently lacks an equivalent concept.
Current Workaround

Use of context:

{
  "decision": false,
  "context": {
    "error": "PIP_UNAVAILABLE",
    "retryable": true
  }
}

This enables:

  • retry logic
  • fallback behavior

However:

  • No standard meaning of fields like error or retryable
  • No guarantee that PEP understands or honors them
  • Still represented as deny at decision level
Proposal (Exploratory)

Introduce a distinction between:
Decision outcome
Evaluation status

Option A: Add status field

{
  "decision": false,
  "status": "indeterminate",
  "context": {
    "error": "PIP_UNAVAILABLE",
    "retryable": true
  }
}

Where:

  • decision remains backward compatible
  • status conveys evaluation reliability

Option B: Extend decision vocabulary

{
  "decision": "indeterminate",
  "context": {
    "error": "PIP_UNAVAILABLE"
  }
}

This is more expressive but may impact backward compatibility.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

No files, tests, or entry points are identified. First clarify whether the intended direction is a status field or an extended decision vocabulary, then establish the interoperability and backward-compatibility requirements; done means the specification change and its semantics are agreed.

Written by the indexing model from the issue text.

Assessment

Domain
api, authorization, security
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Quiet
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.