Skip to content

3.0.0

Release Date: December 17, 2025


๐ŸŽฏ Overview

Forge 3.0 is a major release that brings significant platform upgrades and architectural improvements. This release focuses on modernizing the platform with .NET 10, enhanced authentication with Entra ID support, and improved developer tooling.

Key Highlights

  • ๐Ÿš€ Platform Upgrade: .NET 10.0 and Aspire 13.1 support
  • ๐Ÿ” Dual Authentication: Entra ID (corporate) + Okta (external) authentication
  • ๐Ÿ› ๏ธ CLI Rewrite: Unified services architecture with MCP integration
  • ๐Ÿ“ฆ Terraform Restructuring: Snake_case variables and module version 3.0.0
  • ๐Ÿ“š Documentation Overhaul: Restructured docs with new design system

โœจ New Features

CLI Tools

CLI Rewrite with Unified Services Architecture ๐Ÿš€

Package: SAIF.Platform.CLI

Complete rewrite of the SAIF CLI with a modern unified services architecture and Model Context Protocol (MCP) integration for enhanced developer workflows.

Key Features:

  • โœ… MCP Server Integration - Built-in MCP server for Forge documentation access
  • โœ… Dynamic Command Discovery - ForgeCliTools for automatic CLI command registration
  • โœ… Token Generation - New saif token command for generating access tokens
  • โœ… HTML Content Extraction - ReverseMarkdown integration for documentation processing

New Commands:

  • saif token - Generate access tokens for API testing
  • saif update - Update CLI, templates, and development tools (including Aspire CLI)
  • saif mcp start - Start MCP server for AI assistant integration
  • saif mcp init - Initialize MCP configuration

Benefits:

  • ๐Ÿš€ Simplified local development workflow
  • ๐Ÿ”„ Automatic mock configuration updates
  • ๐ŸŽฏ Better integration with VS Code and GitHub Copilot

MCP Server for Forge Documentation ๐Ÿ“–

Package: SAIF.Platform.CLI

Implement MCP server that provides Forge documentation directly to AI assistants and development tools.

Key Features:

  • โœ… Markdown Download - Automatic download and caching of documentation
  • โœ… Documentation Hooks - Improved content processing and navigation

Benefits:

  • ๐Ÿš€ AI assistants can access Forge documentation in context
  • ๐Ÿ”„ Always up-to-date documentation access

NuGet Packages

.NET 10.0 and Aspire 13.1 Upgrade โฌ†๏ธ

Packages: All SAIF.Platform packages

Upgraded the entire platform to .NET 10.0 LTS and Aspire 13.1 for improved performance and access to new framework features.

Key Changes:

  • โœ… Target Framework - Updated to net10.0
  • โœ… Aspire Integration - Updated to Aspire 13.1 components
  • โœ… Preprocessor Cleanup - Removed legacy .NET compatibility shims

Configuration:

<TargetFramework>net10.0</TargetFramework>

Enhanced Token Caching โšก

Package: SAIF.Platform.Authentication

Improved token caching logic with maximum duration cap for better security and performance.

Benefits:

  • ๐Ÿš€ Faster token retrieval from cache
  • ๐Ÿ”’ Maximum duration cap prevents stale tokens
  • ๐ŸŽฏ Better handling of on-behalf-of token requests

Terraform Modules

Entra ID Authentication Module ๐Ÿ”

Module: security/azure/application

New internal authentication module for Entra ID (Azure AD) supporting corporate authentication scenarios.

Key Features:

  • โœ… Application Registration - Full Entra ID app registration support
  • โœ… Redirect URIs - Web application settings with redirect URI support
  • โœ… Application Identifier URI - Custom identifier URI configuration
  • โœ… Group Membership Claims - Support for groups claims in tokens
  • โœ… Optional Claims - Configurable optional claims for access tokens

Example:

module "application" {
  source  = "app.terraform.io/saif/application/azure"
  version = "~> 3.0.0"

  display_name     = "my-api"
  identifier_uri   = "api://my-api"
  redirect_uris    = ["https://my-api.saif.com/auth/callback"]
}

Application Permissions Module ๐Ÿ“‹

Module: security/azure/application_permissions

Comprehensive module for managing Entra ID application permissions, scopes, and app roles.

Key Features:

  • โœ… Scopes and App Roles - Define OAuth2 scopes and application roles
  • โœ… Pre-Authorized Applications - Automatic API access for trusted apps
  • โœ… Admin Consent - Grant admin consent for delegated permissions
  • โœ… Validation - Prevent overlapping app roles and scopes

Example:

module "permissions" {
  source  = "app.terraform.io/saif/application_permissions/azure"
  version = "~> 3.0.0"

  application_id = module.application.application_id

  scopes = {
    read  = { description = "Read access" }
    write = { description = "Write access" }
  }

  app_roles = {
    admin = { description = "Administrator role" }
  }
}

Entra ID Group Membership Module ๐Ÿ‘ฅ

Module: security/azure/group_membership

New module for managing Entra ID group memberships for non-production role assignments.

Benefits:

  • ๐Ÿš€ Simplified group membership management
  • ๐Ÿ”’ Role-based access control via Entra groups
  • ๐ŸŽฏ Non-production environment support

APIM Policy Split for Entra/Okta ๐Ÿ”„

Module: compute/azure/apim

Split API Management policies between Entra ID and Okta authentication providers for cleaner configuration.

Key Features:

  • โœ… Separate Policies - Distinct policies for corporate (Entra) and external (Okta)
  • โœ… JWT Validation - Proper openid-config URLs for each provider
  • โœ… Centralized Auth URLs - Corp discovery keys and auth URLs in App Configuration

Project Templates

Template Updates for .NET 10 and Aspire 13.1 ๐Ÿ“ฆ

Templates: All SAIF templates

Updated all project templates to target .NET 10.0 with Aspire 13.1 integration.

Key Changes:

  • โœ… Scalar Integration - Replaced Swagger with Scalar for API documentation
  • โœ… JavaScriptAppResource - Updated web front-end resource type
  • โœ… Event Subscription Setup - Azure packages for event subscription
  • โœ… Pipeline Templates - Updated to reference releases/v3 branch
  • โœ… Terraform Modules - Updated to version ~> 3.0.0

Usage:

dotnet new saif-feature-api -n MyApi

Foundry Examples

Aspire Playwright Integration Testing ๐Ÿงช

Example: foundry/dotnet/aspire-playwright

New comprehensive example for integration testing with Playwright in Aspire applications.

Key Features:

  • โœ… API Integration Tests - Test API endpoints with generated clients
  • โœ… Web Integration Tests - End-to-end browser testing
  • โœ… Kiota Client Generation - Generated API clients for Weather API

Documentation:


DevTunnels Webhook Receiver ๐Ÿ”—

Example: foundry/dotnet/devtunnels-simple-webhook

Sample application demonstrating webhook receiver with DevTunnels and real-time dashboard.

Key Features:

  • โœ… DevTunnels Integration - Receive webhooks via Azure DevTunnels
  • โœ… Real-Time Dashboard - Live webhook monitoring UI
  • โœ… Multi-Service Orchestration - Aspire-based service coordination

WireMock CLI Aspire Hosting Extension ๐Ÿงช

Package: SAIF.Platform.Aspire.Hosting

New Aspire hosting extension for WireMock CLI with full orchestration, cloud sync, and service discovery support.

Key Features:

  • โœ… AddWiremockCli Extension - Aspire resource builder for WireMock CLI orchestration
  • โœ… AddMock Method - Add mock services with port allocation and service discovery
  • โœ… WireMock Cloud Sync - Automatic pull from WireMock Cloud projects with autoUpdate option
  • โœ… Health Checks - Built-in health monitoring via /__admin/health endpoint
  • โœ… Dashboard Integration - Mock resources visible in Aspire dashboard with state management
  • โœ… Service Discovery - Seamless WithReference() integration for consuming services

๐Ÿ”ง Enhancements

CLI Tools

  • โœ… SAIF.Platform.CLI - Enhanced application search functionality in token generation
  • โœ… SAIF.Platform.CLI - Updated HttpClient configuration for token service
  • โœ… SAIF.Platform.CLI - Improved command descriptions for clarity and consistency

NuGet Packages

  • โœ… SAIF.Platform.Authentication - Simplified OpenID Connect service scope configuration
  • โœ… SAIF.Platform.Authentication - Removed unnecessary email and User.Read scopes
  • โœ… SAIF.Platform.Kiota - Consolidated ApiDescription.Client into HttpClientLibrary package

Terraform Modules

  • โœ… All Modules - Standardized variable naming to snake_case
  • โœ… All Modules - Updated provider version constraints (AzureRM >= 4.0, AzureAD >= 3.0)
  • โœ… security/azure - Updated UUID generation for scopes and roles
  • โœ… security/azure - Improved token timeout configuration logic
  • โœ… security/okta - Standardized variable names and YAML keys to snake_case

Project Templates

  • โœ… saif-feature-api - Added auth terraform templates and sample configs
  • โœ… All Templates - Improved formatting and structure of resource builder
  • โœ… All Templates - Added descriptions to project templates for clarity

Documentation

  • โœ… MkDocs - Updated table of contents depth for better navigation
  • โœ… Design System - New design system documentation and guidelines
  • โœ… Navigation - Reordered navigation items for improved structure

๐Ÿ› Bug Fixes

NuGet Packages

  • ๐Ÿ› SAIF.Platform.Authentication - Fixed on-behalf-of token request parameters handling
  • ๐Ÿ› SAIF.Platform.Authentication - Corrected casing for Microsoft Graph permission name
  • ๐Ÿ› SAIF.Platform.Authentication - Fixed support for missing projectId and null authTenant when building scopes
  • ๐Ÿ› SAIF.Platform.Authentication - Normalized environment name in scope generation
  • ๐Ÿ› SAIF.Platform.Authentication - Include roles claim when adding custom token claims
  • ๐Ÿ› SAIF.Platform.Aspire - Corrected scalar path in ApiResourceBuilder
  • ๐Ÿ› SAIF.Platform.Kiota - Updated scope assertions for tenant-specific configurations

Terraform Modules

  • ๐Ÿ› security/azure - Fixed group_membership_claims format to array
  • ๐Ÿ› security/azure - Fixed claim value formatting in JWT validation
  • ๐Ÿ› security/azure - Corrected openid-config URL in JWT validation policies
  • ๐Ÿ› security/azure - Use oauth2_permission_scopes when resolving scope ids
  • ๐Ÿ› security/azure - Use login.microsoftonline.com OIDC URLs for corporate auth
  • ๐Ÿ› security/okta - Updated audience to use correct value from OktaApp output
  • ๐Ÿ› security/okta - Updated Okta user and app auth prefix values
  • ๐Ÿ› compute/azure - Fixed for_each errors with unknown conditionals
  • ๐Ÿ› compute/azure - Enable public network access for function app
  • ๐Ÿ› Key Vault - Updated secret references to use versionless ID

Project Templates

  • ๐Ÿ› Templates - Added fallback port values for project templates
  • ๐Ÿ› Templates - Updated OpenAPI file paths in configuration and scripts

CI/CD

  • ๐Ÿ› Azure DevOps - Corrected branch reference in versioning configuration
  • ๐Ÿ› Azure DevOps - Updated vars template paths in multiple YAML files

๐Ÿ“š Documentation

New Documentation

Updated Documentation


โš ๏ธ Breaking Changes

1. Okta Workspaces Limited to External Tenant

Change Description:

Okta authentication workspaces are now restricted to the External tenant only. Corporate authentication must use Entra ID.

Migration Guide:

# Before (Forge 2.x) - Okta for corporate
module "okta_auth" {
  source = "app.terraform.io/saif/okta-app-auth/okta"
  tenant = "Corporate"  # No longer supported
}

# After (Forge 3.0) - Entra ID for corporate
module "entra_auth" {
  source  = "app.terraform.io/saif/application/azure"
  version = "~> 3.0.0"
}

Impact:

  • Applications using Okta for corporate authentication must migrate to Entra ID
  • External tenant applications continue to use Okta

Action Required:

  1. Update Terraform configurations to use Entra ID modules for corporate auth
  2. Update application code to handle Entra ID tokens
  3. See Migration Guide for detailed steps

2. Terraform Variable Naming (snake_case)

Change Description:

All Terraform variable names have been standardized to snake_case for consistency.

Migration Guide:

# Before (Forge 2.x)
module "app" {
  projectId     = "my-project"
  displayName   = "My App"
  authTenant    = "Corporate"
}

# After (Forge 3.0)
module "app" {
  project_id    = "my-project"
  display_name  = "My App"
  auth_tenant   = "Corporate"
}

Impact:

  • All Terraform configurations must update variable names

Action Required:

  1. Run the provided migration script or manually update variable names
  2. Validate Terraform plans before applying

3. .NET 10.0 Target Framework

Change Description:

All packages now target .NET 10.0 only. .NET 8.0 and 9.0 are no longer supported.

Migration Guide:

<!-- Before (Forge 2.x) -->
<TargetFramework>net8.0</TargetFramework>

<!-- After (Forge 3.0) -->
<TargetFramework>net10.0</TargetFramework>

Impact:

  • Applications must upgrade to .NET 10.0 SDK
  • CI/CD pipelines must use .NET 10.0 runtime

Action Required:

  1. Install .NET 10.0 SDK
  2. Update target framework in project files
  3. Update pipeline templates to use dotnet-10.0 images

4. Removed Templates

Change Description:

Legacy templates have been removed: saif-azure-web-onprem, saif-console, saif-web-api, saif-web-mvc.

Impact:

  • New projects cannot use these templates
  • Existing projects are unaffected

Action Required:

  1. Use saif-feature-api or saif-aspire templates for new projects
  2. See CLI Installation Guide for available templates

๐Ÿ“‹ Additional Notes

  • Total commits: 240
  • Files changed: 1,200+
  • Contributors: Emmitt Johnson, Brian Sheridan, Jason Coria Corona Yue, Platform Build Service

Upgrade Path

  1. Review Breaking Changes - Understand impact on your applications
  2. Update .NET SDK - Install .NET 10.0 SDK
  3. Update Terraform - Run migration scripts for variable naming
  4. Update Authentication - Migrate corporate auth from Okta to Entra ID
  5. Test Thoroughly - Validate all integrations before deploying

Support