Call IsConfigOverrideAllowed: read AppSettings:EnvApiDeveloperOverrideAllowed. If the value is empty/unset, the override is allowed by default (checkOverride starts true). If non-empty, bool.TryParse is used: a valid "true"/"false" string sets checkOverride accordingly, but a malformed (non-boolean) string makes bool.TryParse fail and leaves checkOverride at its output default of false — malformed values are treated the same as an explicit false, not as "allowed". If checkOverride is true, the AD group membership check runs: a PrincipalContext(ContextType.Domain) is opened and the machine's computer account is looked up alongside the Developer_Machine_Users group (see security and authorization, AD resource catalog) (BR-EC-04). None of this AD access is wrapped in a try/catch in HostResolver: a domain-connectivity failure or any other exception from PrincipalContext/ComputerPrincipal.FindByIdentity/GroupPrincipal.FindByIdentity propagates uncaught out of IsConfigOverrideAllowed, ResolveHost, and ultimately Setup()/the constructor, rather than resolving to false or being translated into an EnvironmentClientException. Only a successful lookup that returns null for either principal, or finds the computer is not a group member, denies the override without throwing.
If the override is allowed and AppSettings:ApplicationHost is non-empty, set Host = ApplicationHost (lower-cased) and AppConfigOverride = true (BR-EC-05).
Otherwise, derive the host from the content-root path: split IHostEnvironment.ContentRootPath and look for a path segment that matches one of the candidate hosts (case-insensitive) (BR-EC-06).
If no path segment matches, fall back to Environment.MachineName (lower-cased) as the host (BR-EC-07).
AppConfigOverride is only ever assigned inside TryResolveHostFromAppConfig, which runs only when IsConfigOverrideAllowed() returns true. When the override is allowed, TryResolveHostFromAppConfig always assigns AppConfigOverride (true if ApplicationHost is non-empty, false otherwise). When the override is not allowed, TryResolveHostFromAppConfig never runs and AppConfigOverride is left untouched — it remains at its constructor-initialized false, or, if HostResolver is reused across multiple ResolveHost calls, at whatever value a prior allowed call left it. There is no unconditional reset to false on the non-override path.
flowchart TD
A[ResolveHost candidateHosts] --> B["IsConfigOverrideAllowed:<br>EnvApiDeveloperOverrideAllowed + AD group check"]
B -->|allowed| G{ApplicationHost config value set?}
G -->|Yes| C["Host = ApplicationHost<br>AppConfigOverride = true"]
G -->|No| H["AppConfigOverride = false"]
B -->|not allowed| D{"Content-root path<br>segment matches a host?"}
H --> D
D -- Yes --> E["Host = matched segment<br>(AppConfigOverride unchanged)"]
D -- No --> F["Host = MachineName<br>(AppConfigOverride unchanged)"]