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 (
ExFlowWebtargets net10.0) - Frontend build: Vue/Vite output to
ExFlowWeb/wwwroot - Target: FO setup (
AppControl:FO=true)
2) Prerequisites
2.1 Server prerequisites (IIS host)
- Windows Server with latest updates.
- IIS role installed with:
- Web Server
- Static Content
- Default Document
- Request Filtering
- IIS Management Console
- Install ASP.NET Core Hosting Bundle for .NET 10 (required for IIS hosting).
- 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
- .NET SDK 10.x
- Node.js LTS + npm
- 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 totruefor 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).
3.3 Storage-related settings
AppControlOptions expects storage settings for blob/table-backed features. Ensure your environment provides values for:
AppControl:ConnectionStringAppControl:SharedConnectionStringAppControl:RequiredContainersAppControl: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.dllweb.config(generated for ASP.NET Core Module)- all runtime dependencies
5) IIS setup
5.1 Create application pool
- Open IIS Manager.
- Create app pool, e.g.
ExFlowWebPool. - Set:
.NET CLR version: No Managed CodeManaged pipeline mode: Integrated
5.2 Create site
- Create folder, e.g.
C:\inetpub\ExFlowWeb. - Copy publish output from
C:\Deploy\ExFlowWebto this folder. - In IIS, create site (e.g.
ExFlowWeb) and point to that folder. - Bind HTTPS (443) with correct certificate.
- Assign
ExFlowWebPoolto 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(typicallyProduction)
7) Start and validate
7.1 Start
- Start/restart site in IIS.
- If needed after hosting/runtime changes:
iisreset.
7.2 Smoke tests
- Browse site root over HTTPS.
- Confirm login redirect to Microsoft identity provider works.
- Complete sign-in and verify app shell/inbox loads.
- Open browser dev tools and confirm static assets (js/css) are served from the site.
- Validate health endpoint behavior:
GET /api/healthGET /api/health/info
Some health details are protected by
HealthCredentialsmiddleware 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
AzureAdvalues (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 cinpm run dist
- Re-publish and redeploy.
- Confirm files exist under published
wwwroot.
8.4 Dynamics/FO connectivity issues
- Verify
AppControl:Dynamics:ServiceAddressandServiceTenantId. - 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)
- Build frontend (
npm run dist). dotnet publishto a new staging folder.- Stop IIS site.
- Backup current deployment folder.
- Copy new published files.
- Start IIS site.
- Run smoke tests.
10) Notes tied to current repository
ExFlowWebcurrently targetsnet10.0.- Frontend distribution command used by pipeline is
npm run distinExFlowWeb/Client. - Vite distribution output path is configured to
../wwwroot.