Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Step-by-Step Process & Entities

...

1. Developer/Tester (Browser)

  • Person accessing Swagger UI for API testing
  • Can be a developer, QA tester, or technical user
  • Uses their Microsoft credentials to authenticate with Swagger

2. Swagger UI (Interactive API Documentation)

  • Web-based API documentation and testing interface
  • Built into both ApiService and IntegrationServiceAPI
  • Location: /swagger endpoint (e.g., http://localhost:7532/swagger)
  • Allows developers to test API endpoints interactively
  • Uses Scalar UI for enhanced API documentation

3. Microsoft Entra ID (Azure AD Tenant)

  • Microsoft's cloud identity service
  • Stores developer credentials and profiles
  • Tenant ID: 6073ce8b-73f3-4df4-9b80-5e40cdc6965f
  • Issues JWT tokens after successful authentication
  • Hosted by Microsoft (external service)

4. Swagger Client Application

  • Azure AD app registration specifically for Swagger UI
  • Client ID: 84c38b43-12e4-4c26-8292-8910d79aa532
  • Type: Single Page Application (SPA) with PKCE enabled
  • Registered in the same Azure AD tenant

5. ApiService (Backend REST API)

6. IntegrationServiceAPI (Integration REST API)

...

High-Level Authorization Flows

Flow 1: Developer Opens Swagger & Authenticates (Steps 1-6)

┌─────────────────────────────────────────────────────────────────┐
│         SWAGGER AUTHENTICATION FLOW (Steps 1-6)                 │
└─────────────────────────────────────────────────────────────────┘

    ┌──────────────┐
    │  Developer   │
    │   Browser    │
    └──────┬───────┘
           │
           │ Step 1: Navigate to Swagger UI
           │ (http://localhost:7532/swagger)
           ▼
    ┌──────────────────────┐
    │   Swagger UI Page    │
    │   (Unauthenticated)  │
    └──────┬───────────────┘
           │
           │ Step 2: Click "Authorize" button
           │ Select oauth2 security scheme
           ▼
    ┌──────────────────────────────┐
    │  Swagger Authorization Modal │
    │  Shows required scopes       │
    └──────┬───────────────────────┘
           │
           │ Step 3: Click "Authorize"
           │ → Redirect to Microsoft login
           ▼
    ┌──────────────────────────────┐
    │  Microsoft Entra ID          │
    │  Login Page                  │
    └──────┬───────────────────────┘
           │
           │ Step 4: User enters
           │ email + password + MFA
           ▼
    ┌──────────────────────────────┐
    │  Microsoft Entra ID          │
    │  Validates Credentials       │
    └──────┬───────────────────────┘
           │
           │ ✅ Valid credentials
           │
           │ Step 5: Returns
           │ authorization code
           ▼
    ┌──────────────────────┐
    │  Swagger UI          │
    │  (PKCE exchange)     │
    └──────┬───────────────┘
           │
           │ Step 6: Exchange code
           │ for access token
           ▼
    ┌──────────────────────────────┐
    │  Microsoft Entra ID          │
    │  Token Endpoint              │
    └──────┬───────────────────────┘
           │
           │ Returns access token (1h)
           ▼
    ┌────────────────────────────────┐
    │   ✅ SWAGGER AUTHORIZED         │
    │   Can test API endpoints       │
    └────────────────────────────────┘

Flow 2: Testing API Endpoint with Token (Steps 7-8)

┌─────────────────────────────────────────────────────────────────┐
│          API TEST & VALIDATION FLOW (Steps 7-8)                 │
└─────────────────────────────────────────────────────────────────┘

    ┌────────────────────────────────┐
    │   Developer clicks "Try it out"│
    │   on an API endpoint           │
    └────────────┬───────────────────┘
                 │
                 │ Step 7: Swagger adds token to request
                 ▼
    ┌──────────────────────────────────┐
    │  HTTP Request                    │
    │  GET /api/v1/WorkOrder/Overview  │
    │  Authorization: Bearer eyJ...    │
    └──────┬───────────────────────────┘
           │
           │ Step 8: Request received
           ▼
    ┌──────────────────────────────────────┐
    │  ApiService/IntegrationServiceAPI    │
    │  JWT Authentication Middleware       │
    └──────┬───────────────────────────────┘
           │
           │ Token Validation:
           │ ✓ Issuer (Azure AD tenant)
           │ ✓ Audience (this API)
           │ ✓ Signature (Azure AD keys)
           │ ✓ Expiration (not expired)
           │
           ├─── ✅ Valid ────┐    ❌ Invalid ───┐
           │                 │                   │
           ▼                 ▼                   ▼
    ┌──────────────┐  ┌──────────────┐  ┌──────────────┐
    │  Controller  │  │  200 OK      │  │  401/403     │
    │  Executes    │  │  Returns     │  │  Unauthorized│
    │  Endpoint    │  │  Data        │  │  Forbidden   │
    └──────────────┘  └──────────────┘  └──────────────┘

...

Step-by-Step Authorization Process

Step 1: Developer Opens Swagger UI

What happens:

Who's involved:

  • Developer (Browser)
  • Swagger UI

What you see:

  • List of all API endpoints organized by controller
  • Open lock icons (grayed out) indicating authentication required
  • "Authorize" button in the top-right corner

Result:

  • Swagger UI is loaded but cannot test endpoints yet
  • Need to authenticate first

...

Step 2: Click "Authorize" Button

What happens:

  • Developer clicks the "Authorize" button (or clicks a lock icon)
  • Modal dialog appears showing available security schemes
  • Shows OAuth2 (Authorization Code with PKCE) security scheme
  • Displays the required scope for the API

Who's involved:

  • Developer
  • Swagger UI

Authorization modal shows:

For ApiService:

oauth2 (OAuth2, authorizationCode with PKCE)
Scopes:
  api://4dad5d62-dc8c-4378-8bd0-ae736a4d73fe/access_as_user - Access API as user

For IntegrationServiceAPI:

oauth2 (OAuth2, authorizationCode with PKCE)
Scopes:
  api://bd5100ee-af63-4880-8c60-47d4207d60c1/access_as_user - Access Integration API as user

Result:

  • Developer sees what permissions will be requested
  • Ready to start OAuth2 flow

...

Step 3: Initiate OAuth2 Flow

What happens:

  • Developer clicks "Authorize" in the modal
  • Swagger UI starts the OAuth2 Authorization Code flow
  • Browser redirects to Microsoft Entra ID login page
  • Security code (PKCE) generated automatically

Who's involved:

  • Swagger UI
  • Microsoft Entra ID

What's sent to Microsoft:

  • Swagger client ID
  • Which API scope is needed
  • Security challenge code (PKCE)
  • Where to redirect back after login

Result:

  • Browser redirected to Microsoft login page

...

Step 4: Developer Enters Credentials

What happens:

...

  1. API receives request with token
  2. Authentication middleware examines the token
  3. Checks who issued the token (Azure ADEntra ID)
  4. Validates token is authentic:
    • Signature is valid (proves token came from Azure AD)
    • Issuer matches (correct Azure AD tenant)
    • Audience matches (token is for this specific API)
    • Not expired (within 1-hour lifetime)
  5. If all checks pass → Request continues to controller
  6. If any check fails → Return 401 Unauthorized

...

  • Token signature: Proves it's authentic and not forged
  • Issuer: Confirms it came from Azure ADEntra ID
  • Audience: Ensures it's for the correct API
  • Expiration: Checks it hasn't expired

...

  • ✅ Valid token → Controller executes, returns response (200 OK)
  • ❌ Invalid token → Authentication fails, returns 401 Unauthorized
  • Swagger UI displays the response

...

Environment-Based Access Control

Swagger UI access varies by environment for security:

Development Environment (Local)

Testing/Staging/UAT Environments

Production Environment

  • Access: Completely disabled for security
  • Result: Swagger endpoints return 404 Not Found

...

Token Details

Access Token (JWT)

Purpose: Proves developer is authenticated and authorized to call API endpoints

Lifetime: 1 hour

What's in the token:

  • Audience: Which API this token is for (ApiService or IntegrationServiceAPI)
  • Issuer: Microsoft Entra ID (proves it came from Azure AD)
  • Expiration: When the token expires
  • User identity: Developer's name and email
  • Permissions: What the developer can access (scope)
  • Signature: Cryptographic proof the token is authentic

When token expires:

  • After 1 hour, developer must click "Authorize" again
  • No automatic refresh (unlike the Web app)
  • Lock icons change back to open (grayed out)


...

Security Mechanisms

PKCE (Proof Key for Code Exchange)

What it does: Protects the authorization code during the OAuth2 flow Why it matters: Prevents attackers from stealing and using authorization codes How it works: Swagger UI automatically generates a secret code that only it knows, making stolen authorization codes useless

...

Token Signature Validation

What it does: Verifies each token was actually issued by Microsoft Why it matters: Prevents forged or tampered tokens How it works: Azure AD signs tokens with a private key, and the API verifies the signature using Azure AD's public key

...

Token Expiration

What it does: Tokens automatically expire after 1 hour Why it matters: Limits damage if a token is stolen What happens: Developer must re-authorize in Swagger to get a new token

...

Audience Validation

What it does: Ensures tokens are used for the intended API only Why it matters: Prevents using an ApiService token for IntegrationServiceAPI (and vice versa) How it works: Each API only accepts tokens specifically issued for it

...

Issuer Validation

What it does: Verifies tokens come from the correct Azure AD tenant Why it matters: Prevents tokens from other organizations' Azure AD How it works: API only accepts tokens from the configured tenant ID

...

Quick Reference

ApiService

PropertyValue
Swagger URL (Local)http://localhost:7532/swagger
API Client ID4dad5d62-dc8c-4378-8bd0-ae736a4d73fe
Swagger Client ID84c38b43-12e4-4c26-8292-8910d79aa532

...

IntegrationServiceAPI

PropertyValue
Swagger URL (Local)http://localhost:7098/swagger
API Client IDbd5100ee-af63-4880-8c60-47d4207d60c1
Swagger Client ID84c38b43-12e4-4c26-8292-8910d79aa532

...

Common Values

PropertyValue
Tenant ID6073ce8b-73f3-4df4-9b80-5e40cdc6965f
Token Lifetime1 hour
MFA RequiredYes

...