I’ve resolved this exact scenario for a customer running Windchill 11.1 M030 with CAS SSO and a dual-subnet factory environment. Here’s a full breakdown of root cause and fix:
Root Cause:
The Windchill Mobile app (M030, iOS) maintains an in-memory OAuth/CAS session object that includes the originating IP used for the initial authentication handshake. When the device transitions from office Wi-Fi to factory floor Wi-Fi (different subnet), the app’s network-change listener fires onResume behavior rather than a full session teardown. The autoReauthOnResume: true flag only issues a session validation ping — not a full CAS re-authentication. Since the Windchill server’s CAS filter validates the client IP against the service ticket’s recorded origin (a hardened CAS setting common in enterprise deployments), the old ST is rejected with HTTP 401. The sync engine, lacking a REAUTH_ON_401 policy, exhausts its 3 retries and silently drops the queued offline changes to prevent data loss — they stay in the local store but never escalate the error to the UI.
Fix — Step by Step:
- Update
WindchillMobileConfig.plist on all managed devices (via MDM profile push):
<key>networkChangeReauthPolicy</key>
<string>FORCE_REAUTH</string>
<key>offlineSyncRetryPolicy</key>
<string>REAUTH_ON_401</string>
<key>sessionTimeoutMinutes</key>
<integer>120</integer>
<key>autoReauthOnResume</key>
<true/>
Reduce sessionTimeoutMinutes to 120 or less — 480 minutes means stale tokens persist for 8 hours, guaranteeing subnet-transition failures on longer shifts.
- CAS Server — Disable IP Binding on Service Tickets:
In your CAS
cas.properties or application.yml (depending on CAS version), locate:
cas.ticket.st.onlyTrackMostRecentSession=true
More importantly, if you have IP validation enabled:
cas.authn.policy.requiredHandlerAuthenticationPolicyEnabled=false
And ensure rememberMeSessionLength doesn’t force IP-locked sessions. Consult your CAS admin — disabling IP binding slightly reduces security but is standard practice for mobile/roaming clients.
-
F5 Load Balancer — Persist Profile for WTRest:
Create a separate F5 persistence profile for the /Windchill/servlet/WindchillAuthGW/WTRest/ URI path using cookie-based persistence (not source-IP). This ensures that even when the client’s IP changes subnet, the JSESSIONID cookie routes the request back to the same Windchill node, keeping the server-side session intact.
-
Windchill Server — wt.properties addition:
Add the following to ensure both subnets are treated as trusted origins for the REST auth gateway:
wt.httpgw.trusted.subnet.factory=192.168.50.0/24
wt.httpgw.trusted.subnet.office=10.0.0.0/16
Then restart the Windchill method server.
- Recover Stuck Offline Changes:
For technicians who already have stuck offline changes, instruct them to go to
Settings > Offline Data > Force Sync in the app — this re-queues the local change batch and triggers a fresh auth flow post-config update.
Verification:
After deploying these changes, test by taking a device offline on the office network, making a part attribute edit, physically walking to the factory floor subnet, and observing the sync. The diagnostics log should show a REAUTH event followed by a successful HTTP 200 on the /offlineSync endpoint.
This resolved the issue cleanly for the customer. PTC tech note CS351892 is also relevant and confirms the offlineSyncRetryPolicy fix for M029+. Hope this helps!
This draft is based on general Windchill knowledge. It has not been verified against your specific version and environment. Practitioners: verify the steps and share your experience below.