Authentication, Authorization, and Computational Identity: How Systems Decide Who Can Do What

Last Updated June 20, 2026

Authentication, authorization, and computational identity explain how systems decide who or what is interacting with them, what authority that actor has, what actions are permitted, what resources are protected, and how those decisions are recorded. Every secure computational system needs identity boundaries. A user, service, device, process, API client, institution, role, credential, token, key, or agent must be represented before a system can decide what it may do.

Authentication asks: who or what is this actor? Authorization asks: what is this actor allowed to access or change? Computational identity asks how identity becomes a structured object inside software: accounts, credentials, tokens, sessions, roles, attributes, groups, permissions, certificates, keys, claims, scopes, and audit records.

This article introduces authentication, authorization, and computational identity as core topics in algorithms and computational reasoning. It emphasizes that identity is not merely a login screen. It is a computational representation of authority, trust, risk, institutional membership, access, accountability, and security boundaries.

Scholarly editorial illustration of authentication, authorization, and computational identity, showing identity records, access-control matrices, credentials, tokens, permissions, trust boundaries, audit logs, service accounts, and governance review materials.
Authentication, authorization, and computational identity show how systems represent actors, verify credentials, assign permissions, enforce access boundaries, and preserve accountability across people, services, devices, APIs, and institutions.

This article explains identity representation, authentication, authorization, credentials, tokens, sessions, passwords, passkeys, multifactor authentication, role-based access control, attribute-based access control, policy-based access control, scopes, claims, identity federation, single sign-on, OAuth, OpenID Connect, service accounts, machine identity, least privilege, privilege escalation, access reviews, audit trails, governance, traceability, and representation risk. It emphasizes that identity systems are not neutral plumbing. They define who counts, who can act, who is excluded, who is accountable, and how institutional authority becomes executable.

Why Computational Identity Matters

Computational identity matters because access decisions depend on representation. A system cannot enforce permission unless it has some way to represent actors, credentials, sessions, groups, roles, devices, services, organizations, resources, and actions. A hospital record system, payment platform, research repository, government portal, cloud environment, learning platform, internal workflow, AI tool, or public database all need to decide who may see, change, approve, export, delete, delegate, or automate something.

Identity failures become security failures. If the wrong person can log in, authentication has failed. If the right person can do too much, authorization has failed. If an old account remains active, lifecycle governance has failed. If a service token has broad access, machine identity has failed. If logs cannot reconstruct action, accountability has failed.

Identity question Security implication Governance concern
Who is the actor? Authentication must verify a person, service, device, or process. Identity proofing, credentials, session control.
What is the actor allowed to do? Authorization must enforce permissions. Roles, attributes, policies, scopes, approval.
What resource is protected? Access control depends on object classification. Data sensitivity, ownership, retention, legal duty.
What action is requested? Read, write, delete, export, approve, and delegate differ. Fine-grained permission design.
What context matters? Location, device, risk, time, and behavior can affect access. Adaptive access and monitoring.
Can actions be reconstructed? Logs support accountability and incident response. Audit trails, nonrepudiation, evidence preservation.

Computational identity turns institutional authority into executable structure. That makes it powerful and risky.

Back to top ↑

Authentication, Authorization, and Identity Defined

Authentication verifies a claim about identity. Authorization decides what an authenticated or recognized actor may do. Computational identity is the structured representation that makes those decisions possible: an account, credential, token, certificate, key, subject identifier, role, attribute, group, claim, device identity, or service identity.

The distinction matters. A system can authenticate someone correctly and still authorize them incorrectly. A user may log in successfully but receive excessive privileges. A service may present a valid token but use it outside its intended scope. An administrator may have authority that is technically permitted but institutionally inappropriate.

Concept Core question Example
Identity Who or what is represented? User account, service account, device certificate, API client.
Authentication How is the identity claim verified? Password, passkey, MFA, certificate, signed token.
Authorization What is the actor allowed to do? Read record, approve payment, deploy code, export dataset.
Credential What evidence supports access? Password hash, private key, one-time code, hardware key.
Session How is authenticated state maintained? Session cookie, access token, refresh token.
Policy How are access rules expressed? Role assignment, attribute rule, scope, policy engine.

Authentication asks whether the actor is recognized. Authorization asks what the recognized actor may do.

Back to top ↑

Authentication vs. Authorization

Authentication and authorization are often confused because they occur close together in user experience. Logging in feels like “getting access.” But login only establishes an identity claim. Authorization determines which resources and actions are permitted after that claim is accepted.

A common security failure occurs when authentication is strong but authorization is weak. A user may be authenticated correctly but allowed to view another person’s record. A service may have a valid credential but excessive permissions. A role may include broad administrative access because it was convenient during implementation.

Failure pattern Authentication status Authorization problem
Broken object-level authorization User is logged in. User accesses another user’s object by changing an identifier.
Overbroad role Employee is authenticated. Role grants more access than job requires.
Service token misuse Token is valid. Token scope allows unintended resources or actions.
Privilege creep User remains authenticated across career changes. Old permissions are never removed.
Admin bypass Administrator identity is accepted. High-risk actions lack approval or logging.
Policy drift Authentication works as designed. Access policy no longer matches institutional reality.

A secure system needs both identity proof and permission discipline.

Back to top ↑

Identity as Computational Representation

Computational identity is a representation problem. A system must decide which features of an actor matter: username, legal name, employee ID, email address, role, group membership, department, device, organization, risk score, certification, location, key, session, consent status, or delegated authority. These representations become operational facts inside software.

Representation choices are never trivial. A single person may have multiple accounts. A shared account may hide individual accountability. A role may compress diverse responsibilities into one permission set. An identity attribute may be outdated, wrong, sensitive, or institutionally contested. A system may represent identity in ways that exclude people who do not fit expected documents, names, devices, addresses, or institutional categories.

Identity representation What it captures Risk
User account Persistent system identity for a person. May not map cleanly to real responsibility or authority.
Role Permission pattern attached to job or function. May become too broad or outdated.
Group Membership in team, organization, cohort, or domain. May imply access beyond current need.
Attribute Contextual fact about actor or resource. May be stale, sensitive, inaccurate, or discriminatory.
Device identity Recognized machine or endpoint. Device compromise can become account compromise.
Service identity Non-human actor such as API, job, or workload. Often overprivileged and under-monitored.

Identity is not simply discovered by a system. It is modeled, encoded, maintained, and governed.

Back to top ↑

Credentials, Factors, and Authentication Strength

Authentication strength depends on the credentials and factors used to verify identity. Common factors include something you know, something you have, and something you are. Passwords are knowledge factors. Hardware keys, authenticator apps, passkeys, and certificates can be possession-based. Biometrics are inherence factors, though they raise special privacy and revocation concerns.

Multifactor authentication improves security by requiring more than one kind of evidence. But MFA is not automatically equal. SMS codes, app prompts, hardware-backed passkeys, phishing-resistant authenticators, and certificates differ in resistance to theft, phishing, interception, fatigue attacks, and device compromise.

Authentication method Strength contribution Review concern
Password Simple and widely supported. Reuse, phishing, guessing, leaks, weak storage.
One-time code Adds temporary proof. Can be phished or intercepted depending on channel.
Authenticator app Improves over password alone. Push fatigue and device compromise remain concerns.
Hardware security key Strong phishing resistance when properly deployed. Recovery, enrollment, usability, inventory.
Passkey Cryptographic login tied to device or synced credential. Recovery, ecosystem dependence, account portability.
Biometric Convenient local unlock or identity signal. Privacy, false matches, irrevocability, device trust.
Certificate or private key Strong machine or user authentication. Key protection, rotation, revocation, issuance governance.

Authentication strength is not just a technical feature. It depends on enrollment, recovery, phishing resistance, revocation, monitoring, and usability.

Back to top ↑

Sessions, Tokens, Claims, and Scopes

After authentication, systems usually maintain state through sessions or tokens. A session says that the system has accepted an identity for a period of time. A token may carry claims about the subject, issuer, audience, expiration, scopes, roles, or permissions. Tokens can be useful, but they can also become security risks if they are long-lived, overbroad, poorly stored, leaked, replayed, or accepted by the wrong audience.

Claims and scopes are especially important in API systems. A token may say that a client can read data, write data, administer resources, or act on behalf of a user. The system must verify the token, check its issuer, audience, expiration, signature, scope, and context, then enforce policy on the requested action.

Token or session element Meaning Security concern
Subject Identity represented by the token. Subject may be user, service, device, or delegated actor.
Issuer Authority that created the token. System must trust and verify the issuer.
Audience Intended recipient or service. Token should not be accepted by unintended systems.
Expiration Time after which token should not be accepted. Long-lived tokens increase compromise risk.
Scope Allowed operation or permission boundary. Overbroad scopes enable misuse.
Signature Cryptographic protection against tampering. Verification and key rotation are essential.
Refresh token Credential used to obtain new access tokens. High-value target requiring strong protection.

A token is not permission by itself. It is evidence that must be verified and interpreted through policy.

Back to top ↑

Authorization Models

Authorization models define how access decisions are made. Role-based access control assigns permissions through roles. Attribute-based access control uses attributes of subject, resource, action, and environment. Policy-based access control evaluates explicit policies. Capability-based systems grant authority through possession of a token or reference. Access-control lists attach permissions to objects.

Each model has strengths and risks. RBAC is understandable but can become coarse. ABAC is flexible but harder to audit. Policy engines can centralize logic but create complexity. Capability systems can be powerful but require careful delegation and revocation. Real systems often combine models.

Authorization model Core idea Risk
Role-based access control Permissions assigned through roles. Role explosion, overbroad roles, privilege creep.
Attribute-based access control Decisions use subject, resource, action, and context attributes. Policy complexity and stale attributes.
Policy-based access control Rules evaluated by a policy engine. Hidden logic and difficult debugging.
Access-control lists Objects list allowed subjects or groups. Hard to manage at scale.
Capability-based access Possession of capability grants authority. Delegation and revocation must be controlled.
Discretionary access control Owners grant access to resources. Users may share too broadly.
Mandatory access control Central policy controls access by classification. Can be rigid and difficult to administer.

Authorization is an algorithmic decision problem: given a subject, action, resource, and context, should access be allowed?

Back to top ↑

Least Privilege and Privilege Escalation

Least privilege means actors should receive only the access needed for their legitimate task, for the time needed, in the context needed. This principle limits damage when credentials are compromised, accounts are misused, software has bugs, or insiders act beyond authority.

Privilege escalation occurs when an actor gains more authority than intended. This may happen through software vulnerabilities, misconfigured roles, default administrator access, token theft, overly broad service accounts, missing object-level checks, insecure delegation, or weak approval processes.

Privilege issue How it appears Control
Privilege creep Access accumulates as roles change. Periodic access reviews and lifecycle removal.
Standing admin access High authority is always available. Just-in-time elevation and approval workflows.
Overbroad service account Automation can access many systems. Scoped credentials and workload identity.
Broken object authorization User changes object ID to access another record. Object-level permission checks.
Insecure delegation User or service acts on behalf of another without constraints. Scoped delegation, consent, logging, expiration.
Emergency access Break-glass access becomes routine. Strong logging, approval, review, and time limits.

Least privilege is not a slogan. It is a continuous design and governance discipline.

Back to top ↑

Trust Boundaries and Access Control

A trust boundary marks a transition between different assumptions about identity, authority, data, or control. A user-controlled browser crosses a boundary when it sends data to a server. A public API crosses a boundary when it accepts external requests. A microservice crosses a boundary when it calls another service. An AI assistant crosses a boundary when it uses a tool on behalf of a user. A third-party identity provider crosses a boundary when it issues claims that a relying system accepts.

Access control must be enforced at trust boundaries. Systems should not rely only on front-end checks, hidden fields, client-side rules, obscurity, or user interface constraints. Authorization must be enforced where the protected action occurs.

Trust boundary Risk Access-control response
Client to server Client can manipulate requests. Server-side authorization and validation.
Service to service Internal calls may be overtrusted. Mutual authentication and scoped service identity.
User to AI tool Tool action may exceed user intent or authority. Permission checks, confirmation, scoped delegation.
External identity provider Claims may be misinterpreted or overtrusted. Issuer, audience, claim, and policy validation.
Database access Application bug may expose records. Row-level security, least privilege, query controls.
Administrative interface High-impact actions can be misused. Strong authentication, approval, logging, separation of duties.

Trust boundaries show where assumptions must be checked rather than inherited.

Back to top ↑

Identity Federation and Single Sign-On

Identity federation allows one system to rely on identity claims issued by another system. Single sign-on lets users authenticate once and access multiple services. Federation can improve usability and centralize security controls, but it also concentrates trust. If the identity provider is compromised, misconfigured, or overtrusted, many downstream systems may be affected.

Federated identity depends on protocols, claims, scopes, metadata, certificates, redirect URIs, client registrations, consent flows, and policy mappings. The relying system must decide which claims matter and which actions they authorize.

Federation element Purpose Risk
Identity provider Authenticates user and issues claims. Compromise affects many relying services.
Relying party Accepts identity claims for access. May overtrust or misinterpret claims.
Client registration Defines application identity and redirect settings. Misconfiguration can enable token theft or impersonation.
Scopes Limit delegated access. Broad scopes enable excessive authority.
Consent User or admin approves access. Consent fatigue and unclear permissions.
Metadata and keys Support token verification. Key rotation and metadata trust must be maintained.

Federation shifts identity trust across systems. That makes governance and verification essential.

Back to top ↑

Machine Identity, Service Accounts, and APIs

Computational identity is not only human identity. Services, containers, scripts, scheduled jobs, devices, sensors, APIs, databases, and AI agents also need identities. Machine identities often carry powerful access because they move data, call APIs, deploy code, process records, or automate workflows.

Machine identity failures are common because service accounts can be long-lived, overprivileged, poorly documented, shared across systems, excluded from normal access reviews, or forgotten after projects end. API keys, certificates, secrets, tokens, and workload identities must be governed like high-value credentials.

Machine identity Use Security concern
Service account Application or job calls resources. Often overprivileged or long-lived.
API key Client authenticates to an API. Can be leaked, copied, or insufficiently scoped.
Workload identity Runtime environment receives identity without static secret. Requires platform trust and policy discipline.
Device certificate Machine proves identity cryptographically. Issuance, rotation, revocation, and inventory matter.
Automation token Script or pipeline performs actions. Can become a path to privilege escalation.
AI agent authority Agent calls tools or acts on behalf of users. Needs scoped delegation, confirmation, and logs.

Machine identities should be inventoried, scoped, rotated, monitored, and retired with the same seriousness as human accounts.

Back to top ↑

Audit Logs, Nonrepudiation, and Accountability

Identity systems support accountability only when actions can be traced. Audit logs record who did what, when, from where, using which identity, against which resource, through which system, and with what result. Logs are essential for incident response, compliance, abuse detection, debugging, forensic review, and institutional accountability.

Nonrepudiation refers to evidence that an actor cannot credibly deny an action. In practice, this depends on authentication strength, credential protection, logging integrity, time synchronization, signature or approval evidence, and governance. Shared accounts, weak MFA, missing logs, or broad service tokens weaken accountability.

Audit element Purpose Risk if missing
Actor identity Links action to subject, service, or device. Responsibility cannot be assigned.
Action Records what was attempted or completed. Events cannot be reconstructed.
Resource Identifies object affected. Impact cannot be determined.
Timestamp Places action in sequence. Incident timeline becomes uncertain.
Authorization result Shows allow, deny, error, or escalation. Access-control failure may be hidden.
Context Captures IP, device, session, method, or risk signal. Anomaly review becomes weak.
Log integrity Protects records from alteration. Evidence can be disputed or erased.

Access without audit creates power without memory.

Back to top ↑

Privacy, Exclusion, and Identity Governance

Identity systems create privacy and inclusion risks. Strong identity proofing can prevent fraud, but it can also exclude people without expected documents, stable addresses, devices, names, or institutional records. Multifactor authentication can improve security, but recovery flows can lock out users. Biometric systems can raise surveillance, bias, consent, and irrevocability concerns. Centralized identity systems can concentrate data and power.

Identity governance must balance security, usability, privacy, accessibility, legal obligations, institutional authority, and contestability. A secure identity system that excludes legitimate users or exposes sensitive identity attributes can still be harmful.

Governance issue Why it matters Review response
Identity proofing burden Some users lack expected documents or records. Alternative verification and appeal pathways.
Account recovery Recovery is both usability need and attack path. Secure, accessible, monitored recovery design.
Biometric use Biometrics are sensitive and hard to replace. Purpose limitation, consent, local processing, alternatives.
Attribute exposure Identity claims can reveal sensitive facts. Minimal disclosure and claim minimization.
Centralized identity Concentrates dependency and surveillance risk. Data minimization, governance, federation controls.
Access denial Security controls can block legitimate users. Appeals, human review, accessibility, correction.

Identity governance asks not only whether the system keeps attackers out, but whether it lets the right people in under fair, accountable, and privacy-aware conditions.

Back to top ↑

Representation Risk

Representation risk appears when computational identity is treated as if it fully captures personhood, authority, responsibility, or institutional membership. An account is not a person. A role is not a full description of work. A credential is not permanent trust. A token is not moral permission. A biometric match is not a complete identity judgment. A group membership may be wrong, stale, or institutionally contested.

Another representation risk appears when security language hides governance choices. “Access denied” may be presented as technical inevitability when it reflects policy design. “Authorized” may imply legitimacy when it only means a rule allowed the action. “Authenticated” may be mistaken for trustworthy. Identity systems can encode institutional power while appearing as neutral technical checks.

Representation risk How it appears Review response
Account equals person Shared, compromised, or delegated accounts obscure responsibility. Individual accountability and shared-account controls.
Role equals authority Role grants access beyond actual need or legitimacy. Role review and least-privilege redesign.
Authentication equals trust Successful login treated as full trustworthiness. Separate identity verification from behavior and authorization.
Authorization equals legitimacy Allowed action assumed to be institutionally appropriate. Policy review, approvals, and high-risk action controls.
Identity proofing equals fairness People without expected records are excluded. Alternative proofing, appeal, accessibility review.
Token equals intent Valid token assumed to reflect current consent or purpose. Scope, expiration, revocation, and consent review.

Computational identity should be treated as a useful representation, not a complete account of human or institutional reality.

Back to top ↑

Examples Across Authentication and Authorization

The examples below show how authentication, authorization, and computational identity appear across software, institutions, cloud systems, APIs, research workflows, public services, and AI-enabled environments.

Web application login

A user proves control of credentials, receives a session, and accesses resources according to role and policy.

Healthcare record access

Clinicians authenticate strongly, but authorization must still limit access by care relationship, role, purpose, and audit.

Cloud service account

A workload uses a machine identity to read data, write logs, or call APIs without a human login.

Single sign-on

An institution centralizes authentication, but each relying system must interpret claims and permissions correctly.

API scopes

A token grants limited delegated access, such as reading a calendar without permission to delete events.

Administrative approval

High-risk access requires strong authentication, time-limited elevation, dual approval, and detailed logging.

AI tool delegation

An AI agent acts through tools only within the authenticated user’s authority and explicit permission scope.

Research data repository

Researchers receive access based on project role, data sensitivity, approval status, and audit requirements.

Across these examples, identity systems translate people, services, permissions, and institutional rules into executable access decisions.

Back to top ↑

Mathematics, Computation, and Modeling

An authorization decision can be represented as a function:

\[
A(s, r, a, c) \rightarrow \{\text{allow}, \text{deny}\}
\]

Interpretation: An authorization function evaluates subject \(s\), resource \(r\), action \(a\), and context \(c\) to decide whether access is allowed.

A role-based access-control relation can be represented as:

\[
\text{Allowed}(u, p) \iff \exists r \; (u \in r \land p \in \text{Permissions}(r))
\]

Interpretation: User \(u\) is allowed permission \(p\) when \(u\) belongs to a role \(r\) that includes permission \(p\).

A least-privilege goal can be represented as:

\[
P_{\text{granted}} \subseteq P_{\text{needed}} + P_{\text{justified}}
\]

Interpretation: Granted permissions should stay within what is needed and justified for the task, role, time, and context.

A token can be represented as a structured claim set:

\[
T = \{\text{sub}, \text{iss}, \text{aud}, \text{exp}, \text{scope}, \text{claims}\}
\]

Interpretation: A token contains subject, issuer, audience, expiration, scope, and claims that must be verified before policy is applied.

Privilege risk can be represented as:

\[
R_{\text{access}} = S_{\text{resource}} \times P_{\text{privilege}} \times E_{\text{exposure}}
\]

Interpretation: Access risk rises with resource sensitivity, privilege level, and exposure of the credential, actor, or interface.

A trust-boundary check can be represented as:

\[
\text{Input}_{\text{external}} \not\Rightarrow \text{Authority}_{\text{internal}}
\]

Interpretation: External input should not automatically become internal authority; trust must be earned through authentication, validation, and authorization.

These formulas show why identity and access control are computational reasoning problems: actors, resources, actions, policies, credentials, contexts, and risks must be represented explicitly.

Back to top ↑

Python Workflow: Identity and Access Control Audit

The Python workflow below creates a dependency-light audit for authentication, authorization, and computational identity. It scores synthetic systems across authentication strength, authorization granularity, least privilege, token control, machine identity, audit logging, lifecycle review, access governance, privacy review, and incident response. It also demonstrates a simple policy decision function and access-risk scoring.

# authentication_authorization_identity_audit.py
# Dependency-light workflow for identity, authentication, and authorization review.

from __future__ import annotations

from dataclasses import asdict, dataclass
from pathlib import Path
from statistics import mean
import csv
import hashlib
import hmac
import json
import secrets
import time

ARTICLE_ROOT = Path(__file__).resolve().parents[1]
TABLES = ARTICLE_ROOT / "outputs" / "tables"
JSON_DIR = ARTICLE_ROOT / "outputs" / "json"


@dataclass(frozen=True)
class IdentityAccessCase:
    case_name: str
    system_context: str
    protected_resource: str
    authentication_strength: float
    authorization_granularity: float
    least_privilege_alignment: float
    session_token_control: float
    machine_identity_governance: float
    audit_logging: float
    access_lifecycle_review: float
    privilege_escalation_controls: float
    privacy_and_inclusion_review: float
    incident_response: float
    governance_ownership: float
    communication_clarity: float


def clamp(value: float, low: float = 0.0, high: float = 100.0) -> float:
    return max(low, min(high, value))


def identity_access_score(case: IdentityAccessCase) -> float:
    return clamp(
        100.0 * (
            0.10 * case.authentication_strength
            + 0.11 * case.authorization_granularity
            + 0.11 * case.least_privilege_alignment
            + 0.09 * case.session_token_control
            + 0.09 * case.machine_identity_governance
            + 0.10 * case.audit_logging
            + 0.09 * case.access_lifecycle_review
            + 0.09 * case.privilege_escalation_controls
            + 0.08 * case.privacy_and_inclusion_review
            + 0.06 * case.incident_response
            + 0.06 * case.governance_ownership
            + 0.02 * case.communication_clarity
        )
    )


def identity_access_risk(case: IdentityAccessCase) -> float:
    weak_points = [
        1.0 - case.authentication_strength,
        1.0 - case.authorization_granularity,
        1.0 - case.least_privilege_alignment,
        1.0 - case.session_token_control,
        1.0 - case.machine_identity_governance,
        1.0 - case.audit_logging,
        1.0 - case.access_lifecycle_review,
        1.0 - case.privilege_escalation_controls,
        1.0 - case.privacy_and_inclusion_review,
        1.0 - case.incident_response,
        1.0 - case.governance_ownership,
    ]
    return clamp(100.0 * mean(weak_points))


def diagnose(score: float, risk: float) -> str:
    if score >= 84 and risk <= 20:
        return "strong identity and access governance"
    if score >= 70 and risk <= 35:
        return "usable identity posture with review needs"
    if risk >= 55:
        return "high risk; authentication, authorization, least privilege, token control, machine identity, audit logging, or governance may be weak"
    return "partial identity posture; strengthen authentication, authorization, least privilege, token control, machine identity, access reviews, logging, privacy review, and governance"


def hash_secret(secret: str, salt: bytes) -> str:
    digest = hashlib.pbkdf2_hmac("sha256", secret.encode("utf-8"), salt, 200_000)
    return digest.hex()


def password_storage_demo() -> list[dict[str, object]]:
    salt = secrets.token_bytes(16)
    stored = hash_secret("correct horse battery staple", salt)
    candidate_good = hash_secret("correct horse battery staple", salt)
    candidate_bad = hash_secret("incorrect password", salt)

    return [
        {
            "case": "correct_candidate",
            "verified": hmac.compare_digest(stored, candidate_good),
            "algorithm": "PBKDF2-HMAC-SHA256",
            "iterations": 200000,
            "interpretation": "A stored derived secret verifies without storing the plaintext password."
        },
        {
            "case": "incorrect_candidate",
            "verified": hmac.compare_digest(stored, candidate_bad),
            "algorithm": "PBKDF2-HMAC-SHA256",
            "iterations": 200000,
            "interpretation": "Incorrect secret fails verification against the stored derived value."
        },
    ]


def policy_decision(subject: dict[str, object], resource: dict[str, object], action: str, context: dict[str, object]) -> dict[str, object]:
    role = str(subject.get("role", ""))
    department = str(subject.get("department", ""))
    resource_department = str(resource.get("department", ""))
    sensitivity = str(resource.get("sensitivity", "standard"))
    mfa = bool(context.get("mfa", False))
    emergency = bool(context.get("emergency", False))

    allowed = False
    reason = "default deny"

    if role == "admin" and mfa:
        allowed = True
        reason = "admin with MFA"
    elif role == "clinician" and action == "read" and department == resource_department and mfa:
        allowed = True
        reason = "same-department clinician read with MFA"
    elif role == "researcher" and action == "read" and sensitivity == "deidentified":
        allowed = True
        reason = "researcher read deidentified data"
    elif emergency and role in {"clinician", "admin"} and mfa:
        allowed = True
        reason = "break-glass emergency access with MFA"

    return {
        "subject": subject.get("subject"),
        "role": role,
        "resource": resource.get("resource"),
        "action": action,
        "sensitivity": sensitivity,
        "mfa": mfa,
        "emergency": emergency,
        "decision": "allow" if allowed else "deny",
        "reason": reason,
    }


def authorization_demo() -> list[dict[str, object]]:
    subjects = [
        {"subject": "alice", "role": "clinician", "department": "cardiology"},
        {"subject": "bob", "role": "researcher", "department": "analytics"},
        {"subject": "carol", "role": "admin", "department": "security"},
        {"subject": "service_ingest", "role": "service", "department": "platform"},
    ]
    resources = [
        {"resource": "patient_record_100", "department": "cardiology", "sensitivity": "restricted"},
        {"resource": "deidentified_dataset_7", "department": "analytics", "sensitivity": "deidentified"},
    ]

    scenarios = [
        (subjects[0], resources[0], "read", {"mfa": True, "emergency": False}),
        (subjects[0], resources[0], "delete", {"mfa": True, "emergency": False}),
        (subjects[1], resources[1], "read", {"mfa": False, "emergency": False}),
        (subjects[1], resources[0], "read", {"mfa": True, "emergency": False}),
        (subjects[2], resources[0], "delete", {"mfa": True, "emergency": False}),
        (subjects[3], resources[1], "write", {"mfa": False, "emergency": False}),
    ]

    return [policy_decision(subject, resource, action, context) for subject, resource, action, context in scenarios]


def access_risk_register() -> list[dict[str, object]]:
    cases = [
        {
            "access_path": "admin_console",
            "resource_sensitivity": 0.95,
            "privilege_level": 0.95,
            "credential_exposure": 0.35,
            "control_strength": 0.78,
        },
        {
            "access_path": "service_account_data_export",
            "resource_sensitivity": 0.85,
            "privilege_level": 0.80,
            "credential_exposure": 0.55,
            "control_strength": 0.52,
        },
        {
            "access_path": "standard_user_profile_edit",
            "resource_sensitivity": 0.45,
            "privilege_level": 0.35,
            "credential_exposure": 0.40,
            "control_strength": 0.66,
        },
        {
            "access_path": "research_dataset_read",
            "resource_sensitivity": 0.70,
            "privilege_level": 0.50,
            "credential_exposure": 0.30,
            "control_strength": 0.70,
        },
        {
            "access_path": "break_glass_emergency_access",
            "resource_sensitivity": 0.95,
            "privilege_level": 0.90,
            "credential_exposure": 0.50,
            "control_strength": 0.64,
        },
    ]

    rows: list[dict[str, object]] = []

    for case in cases:
        inherent = 100.0 * float(case["resource_sensitivity"]) * float(case["privilege_level"]) * float(case["credential_exposure"])
        residual = inherent * (1.0 - float(case["control_strength"]))
        rows.append({
            **case,
            "inherent_access_risk": round(inherent, 3),
            "residual_access_risk": round(residual, 3),
            "review_priority": "high" if residual >= 20 else "medium" if residual >= 10 else "standard",
        })

    return rows


def access_lifecycle_review() -> list[dict[str, object]]:
    now = int(time.time())
    day = 86400

    accounts = [
        {"identity": "alice", "identity_type": "human", "last_review_days": 42, "privileged": False, "active": True},
        {"identity": "carol_admin", "identity_type": "human", "last_review_days": 110, "privileged": True, "active": True},
        {"identity": "service_ingest", "identity_type": "service", "last_review_days": 210, "privileged": True, "active": True},
        {"identity": "legacy_export_job", "identity_type": "service", "last_review_days": 390, "privileged": True, "active": True},
        {"identity": "former_contractor", "identity_type": "human", "last_review_days": 270, "privileged": False, "active": False},
    ]

    rows: list[dict[str, object]] = []

    for account in accounts:
        last_review_age = int(account["last_review_days"])
        privileged = bool(account["privileged"])
        active = bool(account["active"])
        needs_review = last_review_age > 90 or (privileged and last_review_age > 45) or not active
        rows.append({
            **account,
            "approx_last_review_timestamp": now - last_review_age * day,
            "needs_review": needs_review,
            "recommendation": "remove or disable" if not active else "urgent review" if privileged and last_review_age > 90 else "review" if needs_review else "standard monitoring",
        })

    return rows


def build_cases() -> list[IdentityAccessCase]:
    return [
        IdentityAccessCase(
            case_name="Clinical record access platform",
            system_context="Healthcare system with sensitive records, clinician roles, emergency access, and audit obligations.",
            protected_resource="patient records",
            authentication_strength=0.88,
            authorization_granularity=0.84,
            least_privilege_alignment=0.78,
            session_token_control=0.82,
            machine_identity_governance=0.70,
            audit_logging=0.90,
            access_lifecycle_review=0.80,
            privilege_escalation_controls=0.78,
            privacy_and_inclusion_review=0.76,
            incident_response=0.82,
            governance_ownership=0.84,
            communication_clarity=0.76,
        ),
        IdentityAccessCase(
            case_name="Cloud analytics workspace",
            system_context="Research and analytics platform with datasets, notebooks, service accounts, and shared projects.",
            protected_resource="institutional datasets and compute environment",
            authentication_strength=0.82,
            authorization_granularity=0.76,
            least_privilege_alignment=0.70,
            session_token_control=0.72,
            machine_identity_governance=0.66,
            audit_logging=0.78,
            access_lifecycle_review=0.68,
            privilege_escalation_controls=0.66,
            privacy_and_inclusion_review=0.72,
            incident_response=0.70,
            governance_ownership=0.72,
            communication_clarity=0.70,
        ),
        IdentityAccessCase(
            case_name="Public benefits portal",
            system_context="Public-facing portal requiring account recovery, identity proofing, appeals, and privacy-sensitive access.",
            protected_resource="applicant records and benefit status",
            authentication_strength=0.70,
            authorization_granularity=0.72,
            least_privilege_alignment=0.74,
            session_token_control=0.68,
            machine_identity_governance=0.58,
            audit_logging=0.74,
            access_lifecycle_review=0.66,
            privilege_escalation_controls=0.64,
            privacy_and_inclusion_review=0.84,
            incident_response=0.68,
            governance_ownership=0.72,
            communication_clarity=0.76,
        ),
        IdentityAccessCase(
            case_name="Legacy internal admin script",
            system_context="Internal automation uses shared credentials and broad permissions for operational convenience.",
            protected_resource="production database",
            authentication_strength=0.28,
            authorization_granularity=0.18,
            least_privilege_alignment=0.16,
            session_token_control=0.20,
            machine_identity_governance=0.14,
            audit_logging=0.22,
            access_lifecycle_review=0.18,
            privilege_escalation_controls=0.14,
            privacy_and_inclusion_review=0.20,
            incident_response=0.24,
            governance_ownership=0.18,
            communication_clarity=0.26,
        ),
    ]


def run_audit() -> list[dict[str, object]]:
    rows: list[dict[str, object]] = []

    for case in build_cases():
        score = identity_access_score(case)
        risk = identity_access_risk(case)
        rows.append({
            **asdict(case),
            "identity_access_score": round(score, 3),
            "identity_access_risk": round(risk, 3),
            "diagnostic": diagnose(score, risk),
        })

    return rows


def write_csv(path: Path, rows: list[dict[str, object]]) -> None:
    path.parent.mkdir(parents=True, exist_ok=True)
    if not rows:
        path.write_text("", encoding="utf-8")
        return

    fieldnames = sorted({key for row in rows for key in row.keys()})

    with path.open("w", newline="", encoding="utf-8") as handle:
        writer = csv.DictWriter(handle, fieldnames=fieldnames, extrasaction="ignore")
        writer.writeheader()
        writer.writerows(rows)


def write_json(path: Path, payload: object) -> None:
    path.parent.mkdir(parents=True, exist_ok=True)
    path.write_text(json.dumps(payload, indent=2, sort_keys=True), encoding="utf-8")


def summarize(
    audit_rows: list[dict[str, object]],
    auth_rows: list[dict[str, object]],
    risk_rows: list[dict[str, object]],
    lifecycle_rows: list[dict[str, object]],
) -> dict[str, object]:
    allowed = sum(1 for row in auth_rows if row["decision"] == "allow")
    denied = sum(1 for row in auth_rows if row["decision"] == "deny")
    high_risk_paths = sum(1 for row in risk_rows if row["review_priority"] == "high")
    lifecycle_reviews = sum(1 for row in lifecycle_rows if bool(row["needs_review"]))

    return {
        "case_count": len(audit_rows),
        "average_identity_access_score": round(mean(float(row["identity_access_score"]) for row in audit_rows), 3),
        "average_identity_access_risk": round(mean(float(row["identity_access_risk"]) for row in audit_rows), 3),
        "highest_score_case": max(audit_rows, key=lambda row: float(row["identity_access_score"]))["case_name"],
        "highest_risk_case": max(audit_rows, key=lambda row: float(row["identity_access_risk"]))["case_name"],
        "authorization_allowed_count": allowed,
        "authorization_denied_count": denied,
        "high_risk_access_paths": high_risk_paths,
        "accounts_needing_lifecycle_review": lifecycle_reviews,
        "interpretation": "Identity and access governance depends on authentication strength, authorization granularity, least privilege, token control, machine identity, audit logging, lifecycle review, privilege escalation controls, privacy review, incident response, and governance ownership."
    }


def main() -> None:
    audit_rows = run_audit()
    password_rows = password_storage_demo()
    auth_rows = authorization_demo()
    risk_rows = access_risk_register()
    lifecycle_rows = access_lifecycle_review()
    summary = summarize(audit_rows, auth_rows, risk_rows, lifecycle_rows)

    write_csv(TABLES / "identity_access_governance_audit.csv", audit_rows)
    write_csv(TABLES / "identity_access_governance_summary.csv", [summary])
    write_csv(TABLES / "password_storage_demo.csv", password_rows)
    write_csv(TABLES / "authorization_policy_demo.csv", auth_rows)
    write_csv(TABLES / "access_risk_register.csv", risk_rows)
    write_csv(TABLES / "access_lifecycle_review.csv", lifecycle_rows)

    write_json(JSON_DIR / "identity_access_governance_audit.json", audit_rows)
    write_json(JSON_DIR / "identity_access_governance_summary.json", summary)
    write_json(JSON_DIR / "password_storage_demo.json", password_rows)
    write_json(JSON_DIR / "authorization_policy_demo.json", auth_rows)
    write_json(JSON_DIR / "access_risk_register.json", risk_rows)
    write_json(JSON_DIR / "access_lifecycle_review.json", lifecycle_rows)

    print("Authentication, authorization, and computational identity audit complete.")
    print(TABLES / "identity_access_governance_audit.csv")


if __name__ == "__main__":
    main()

This workflow treats identity and access as a governed computation: represent the actor, verify credentials, evaluate policy, limit privileges, review machine identities, preserve logs, and manage lifecycle risk.

Back to top ↑

R Workflow: Access Governance Summary

The R workflow reads the Python-generated audit tables and creates summary outputs and visualizations using base R. It compares identity-access posture and risk, summarizes authorization decisions, reviews access lifecycle findings, and plots residual access risk.

# authentication_authorization_identity_summary.R
# Base R workflow for summarizing identity and access governance audits.

args <- commandArgs(trailingOnly = FALSE)
file_arg <- grep("^--file=", args, value = TRUE)

if (length(file_arg) > 0) {
  script_path <- normalizePath(sub("^--file=", "", file_arg[1]), mustWork = TRUE)
  article_root <- normalizePath(file.path(dirname(script_path), ".."), mustWork = TRUE)
} else {
  article_root <- getwd()
}

setwd(article_root)

tables_dir <- file.path(article_root, "outputs", "tables")
figures_dir <- file.path(article_root, "outputs", "figures")

if (!dir.exists(tables_dir)) {
  dir.create(tables_dir, recursive = TRUE)
}

if (!dir.exists(figures_dir)) {
  dir.create(figures_dir, recursive = TRUE)
}

audit_path <- file.path(tables_dir, "identity_access_governance_audit.csv")

if (!file.exists(audit_path)) {
  stop(paste("Missing", audit_path, "Run the Python workflow first."))
}

data <- read.csv(audit_path, stringsAsFactors = FALSE)

summary_table <- data.frame(
  case_count = nrow(data),
  average_identity_access_score = mean(data$identity_access_score),
  average_identity_access_risk = mean(data$identity_access_risk),
  highest_score_case = data$case_name[which.max(data$identity_access_score)],
  highest_risk_case = data$case_name[which.max(data$identity_access_risk)]
)

write.csv(
  summary_table,
  file.path(tables_dir, "r_identity_access_governance_summary.csv"),
  row.names = FALSE
)

comparison_matrix <- rbind(
  data$identity_access_score,
  data$identity_access_risk
)

colnames(comparison_matrix) <- data$case_name
rownames(comparison_matrix) <- c(
  "Identity access score",
  "Identity access risk"
)

png(
  file.path(figures_dir, "identity_access_score_vs_risk.png"),
  width = 1500,
  height = 850
)

barplot(
  comparison_matrix,
  beside = TRUE,
  las = 2,
  ylim = c(0, 100),
  ylab = "Score",
  main = "Identity and Access Governance Score vs. Risk"
)

legend(
  "topleft",
  legend = rownames(comparison_matrix),
  pch = 15,
  bty = "n"
)

grid()
dev.off()

auth_path <- file.path(tables_dir, "authorization_policy_demo.csv")

if (file.exists(auth_path)) {
  auth_data <- read.csv(auth_path, stringsAsFactors = FALSE)
  decision_counts <- table(auth_data$decision)

  png(
    file.path(figures_dir, "authorization_decision_counts.png"),
    width = 1100,
    height = 750
  )

  barplot(
    decision_counts,
    ylim = c(0, max(decision_counts) + 1),
    ylab = "Count",
    main = "Authorization Policy Decisions"
  )

  grid()
  dev.off()
}

risk_path <- file.path(tables_dir, "access_risk_register.csv")

if (file.exists(risk_path)) {
  risk_data <- read.csv(risk_path, stringsAsFactors = FALSE)

  risk_matrix <- rbind(
    risk_data$inherent_access_risk,
    risk_data$residual_access_risk
  )

  colnames(risk_matrix) <- risk_data$access_path
  rownames(risk_matrix) <- c("Inherent risk", "Residual risk")

  png(
    file.path(figures_dir, "inherent_vs_residual_access_risk.png"),
    width = 1500,
    height = 850
  )

  barplot(
    risk_matrix,
    beside = TRUE,
    las = 2,
    ylim = c(0, max(risk_matrix) + 10),
    ylab = "Risk score",
    main = "Inherent vs. Residual Access Risk"
  )

  legend("topleft", legend = rownames(risk_matrix), pch = 15, bty = "n")
  grid()
  dev.off()
}

lifecycle_path <- file.path(tables_dir, "access_lifecycle_review.csv")

if (file.exists(lifecycle_path)) {
  lifecycle_data <- read.csv(lifecycle_path, stringsAsFactors = FALSE)

  png(
    file.path(figures_dir, "access_lifecycle_review_age.png"),
    width = 1400,
    height = 850
  )

  barplot(
    lifecycle_data$last_review_days,
    names.arg = lifecycle_data$identity,
    las = 2,
    ylab = "Days since last review",
    main = "Access Lifecycle Review Age"
  )

  abline(h = 90, lty = 2)
  grid()
  dev.off()
}

password_path <- file.path(tables_dir, "password_storage_demo.csv")

if (file.exists(password_path)) {
  password_data <- read.csv(password_path, stringsAsFactors = FALSE)

  write.csv(
    password_data,
    file.path(tables_dir, "r_password_storage_demo.csv"),
    row.names = FALSE
  )
}

print(summary_table)

This workflow helps compare authentication strength, authorization granularity, least privilege, token control, machine identity governance, audit logging, lifecycle review, access-risk reduction, privacy review, incident response, and governance ownership.

Back to top ↑

GitHub Repository

The companion repository for this article provides reproducible code, synthetic datasets, workflow documentation, generated outputs, identity and access calculators, authorization-policy examples, password-storage demonstrations, access-risk registers, lifecycle-review tables, audit-log templates, governance checklists, and Canvas-ready artifacts that extend the article into executable examples.

Back to top ↑

A Practical Method for Identity and Access Review

A practical identity and access review begins by inventorying actors, resources, actions, credentials, roles, service accounts, tokens, policies, logs, and governance owners. The review should distinguish authentication quality from authorization quality. Strong login controls cannot compensate for excessive permissions.

Step Question Output
1. Inventory identities. Who or what can act in the system? Human, service, device, API, and agent identity inventory.
2. Classify resources. What data, functions, systems, or workflows are protected? Resource sensitivity map.
3. Map actions. What can actors do? Read, write, delete, export, approve, delegate, administer.
4. Review authentication. How is identity verified? Credential and MFA assessment.
5. Review authorization. Are permissions scoped to real need? Role, policy, scope, and permission review.
6. Check trust boundaries. Where does authority cross systems? Boundary map and enforcement checks.
7. Audit machine identities. What non-human actors have access? Service-account and token review.
8. Test privilege escalation. Can actors gain more authority than intended? Escalation test results and remediation.
9. Verify logging. Can access decisions and actions be reconstructed? Audit-log coverage report.
10. Govern lifecycle. Are accounts created, changed, reviewed, and removed correctly? Joiner-mover-leaver and access-review process.

Identity review should be repeated because people change roles, services evolve, tokens age, permissions drift, and institutions reorganize.

Back to top ↑

Common Pitfalls

A common pitfall is assuming that login security is the same as system security. Authentication can be strong while authorization is weak. Another pitfall is focusing on human users while ignoring service accounts, API tokens, automation scripts, devices, and AI agents. Machine identities often become the most powerful and least visible actors in a system.

Common pitfalls include:

  • authentication-authorisation confusion: treating a valid login as permission for all actions;
  • overbroad roles: granting access for convenience rather than need;
  • privilege creep: permissions accumulate as people change jobs or projects;
  • shared accounts: accountability disappears when identities are not individual or traceable;
  • long-lived tokens: exposed credentials remain useful for too long;
  • forgotten service accounts: automation keeps access after the original purpose ends;
  • client-side authorization: protected actions rely on interface controls rather than server enforcement;
  • weak recovery flows: account recovery becomes easier to attack than login;
  • identity proofing exclusion: legitimate users are blocked because they lack expected documents or devices;
  • missing audit trails: actions cannot be reconstructed after incident or dispute.

The remedy is identity discipline: strong authentication, precise authorization, least privilege, service-account governance, scoped tokens, trust-boundary enforcement, recovery review, access lifecycle management, audit logging, privacy-aware identity design, and accountable governance.

Back to top ↑

Why Identity Is Algorithmic Infrastructure

Authentication, authorization, and computational identity show how security, trust, governance, and institutional authority become executable. Before a system can protect a record, approve a transaction, train a model, run a workflow, invoke a tool, or disclose a result, it must represent who or what is acting and what authority that actor has.

Identity is therefore algorithmic infrastructure. It defines subjects, resources, actions, permissions, roles, attributes, sessions, tokens, scopes, claims, trust boundaries, logs, and lifecycle states. It shapes who can participate, who can access knowledge, who can act with institutional authority, who can be held accountable, and who may be excluded.

Responsible identity systems do not stop at login. They ask whether authentication is strong enough, whether authorization is precise enough, whether machine identities are governed, whether privileges are reviewed, whether logs preserve accountability, whether recovery is secure and accessible, whether privacy is protected, whether identity proofing is fair, and whether access decisions remain aligned with institutional purpose.

The next article turns to security failures as algorithmic failures: how weak assumptions, brittle procedures, flawed implementations, poor incentives, missing governance, and unsafe identity or access design produce vulnerability.

Back to top ↑

Further Reading

References

Back to top ↑

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top