Skip to main content

Install ExFlow Web (FO) on IIS – Current Version

1) Purpose and scope

This runbook describes a fresh installation of the current ExFlow Web version from this repository to a single Windows Server running IIS.

  • App stack: ASP.NET Core + .NET (ExFlowWeb targets net10.0)
  • Frontend build: Vue/Vite output to ExFlowWeb/wwwroot
  • Target: FO setup (AppControl:FO=true)

2) Prerequisites

2.1 Server prerequisites (IIS host)

  1. Windows Server with latest updates.
  2. IIS role installed with:
    • Web Server
    • Static Content
    • Default Document
    • Request Filtering
    • IIS Management Console
  3. Install ASP.NET Core Hosting Bundle for .NET 10 (required for IIS hosting).
  4. HTTPS certificate available for the site binding.

If the hosting bundle is installed/updated after IIS is already running, run iisreset.

2.2 Build/deploy workstation prerequisites

  1. .NET SDK 10.x
  2. Node.js LTS + npm
  3. Access to this repository

2.3 Identity and external access prerequisites

Confirm these before go-live:

  • Microsoft Entra ID app registration for AzureAd (ClientId/Tenant/sign-in redirect).
  • Dynamics FO endpoint and tenant values.
  • Any required Azure resources (Storage/App Configuration/Application Insights) and credentials.

3) Required configuration checklist

Populate production values in your deployment configuration (appsettings/environment/App Configuration) before start.

3.1 Core app settings (ExFlowWeb/appsettings.json)

  • HealthCredentials – API key for health endpoints.
  • AzureAd:* – login/auth settings (Instance, ClientId, TenantId, CallbackPath).
  • AppControl:Salt – unique per environment.
  • AppControl:FO – set to true for FO deployment.
  • AppControl:Dynamics:ServiceAddress – FO base URL.
  • AppControl:Dynamics:ServiceTenantId – FO tenant ID.
  • McpServer:ApiKey – required if MCP endpoint is used.

3.2 Optional but commonly used settings

  • ConnectionStrings:AppConfig – if using Azure App Configuration.
  • ApplicationInsights:ConnectionString (or equivalent instrumentation setting) for telemetry.
  • AzureAd:ClientSecret (if not using managed identity/federated credential flow).

AppControlOptions expects storage settings for blob/table-backed features. Ensure your environment provides values for:

  • AppControl:ConnectionString
  • AppControl:SharedConnectionString
  • AppControl:RequiredContainers
  • AppControl:RequiredTables

(These may come from appsettings, environment variables, or Azure App Configuration depending on your environment standard.)


4) Build and publish

Run from repository root.

4.1 Build frontend assets into wwwroot

cd ExFlowWeb/Client
npm ci
npm run dist

Expected: Vite build writes output to ExFlowWeb/wwwroot.

4.2 Publish backend for IIS

cd ../..
dotnet restore
dotnet publish ExFlowWeb/ExFlowWeb.csproj -c Release -o C:\Deploy\ExFlowWeb

Expected publish output includes:

  • ExFlowWeb.dll
  • web.config (generated for ASP.NET Core Module)
  • all runtime dependencies

5) IIS setup

5.1 Create application pool

  1. Open IIS Manager.
  2. Create app pool, e.g. ExFlowWebPool.
  3. Set:
    • .NET CLR version: No Managed Code
    • Managed pipeline mode: Integrated

5.2 Create site

  1. Create folder, e.g. C:\inetpub\ExFlowWeb.
  2. Copy publish output from C:\Deploy\ExFlowWeb to this folder.
  3. In IIS, create site (e.g. ExFlowWeb) and point to that folder.
  4. Bind HTTPS (443) with correct certificate.
  5. Assign ExFlowWebPool to the site.

5.3 File system permissions

Grant the app pool identity read/execute on the site folder:

  • IIS AppPool\ExFlowWebPool (or your custom service account)

If logging/temp paths are configured outside site root, grant required write permissions there as well.


6) Environment configuration on server

Use your standard approach (recommended: environment variables and/or Azure App Configuration).

For IIS-hosted ASP.NET Core, environment variables can be set at machine scope or via IIS configuration strategy used by your team.

Minimum to verify before start:

  • Auth values (AzureAd:*)
  • FO endpoint values (AppControl:Dynamics:*)
  • Storage/AppConfig values (if used)
  • ASPNETCORE_ENVIRONMENT (typically Production)

7) Start and validate

7.1 Start

  1. Start/restart site in IIS.
  2. If needed after hosting/runtime changes: iisreset.

7.2 Smoke tests

  1. Browse site root over HTTPS.
  2. Confirm login redirect to Microsoft identity provider works.
  3. Complete sign-in and verify app shell/inbox loads.
  4. Open browser dev tools and confirm static assets (js/css) are served from the site.
  5. Validate health endpoint behavior:
    • GET /api/health
    • GET /api/health/info

Some health details are protected by HealthCredentials middleware rules.


8) Troubleshooting

8.1 HTTP 500.30 / app fails to start

  • Confirm .NET 10 hosting bundle installed.
  • Check Windows Event Viewer (Application log).
  • Check stdout logs if enabled in web.config.

8.2 Login/auth errors

  • Verify AzureAd values (Instance, ClientId, TenantId, CallbackPath).
  • Verify redirect URI registration matches deployed URL.
  • If using client secret, validate secret is current.

8.3 Missing frontend/static files

  • Re-run:
    • npm ci
    • npm run dist
  • Re-publish and redeploy.
  • Confirm files exist under published wwwroot.

8.4 Dynamics/FO connectivity issues

  • Verify AppControl:Dynamics:ServiceAddress and ServiceTenantId.
  • Verify outbound HTTPS access from server to required endpoints.
  • Confirm app identity has correct permissions in FO/Azure AD.

9) Upgrade/redeploy procedure (same server)

  1. Build frontend (npm run dist).
  2. dotnet publish to a new staging folder.
  3. Stop IIS site.
  4. Backup current deployment folder.
  5. Copy new published files.
  6. Start IIS site.
  7. Run smoke tests.

10) Notes tied to current repository

  • ExFlowWeb currently targets net10.0.
  • Frontend distribution command used by pipeline is npm run dist in ExFlowWeb/Client.
  • Vite distribution output path is configured to ../wwwroot.