IdentityModel.OidcClient.Samples icon indicating copy to clipboard operation
IdentityModel.OidcClient.Samples copied to clipboard

Need a way to use OidcClient from a worker thread

Open jzkirtley opened this issue 3 years ago • 2 comments
trafficstars

I am currently attempting to use OIDC authentication in a legacy Winforms app. The login process is extremely arcane (it can happen in the background or through user action, and authentication can take a number of different forms). Much of the login code predates the async/await model in .net, and involves worker threads that occasionally post information back to the main UI thread (for example, status updates)

Because of this, I need to be able to call OidcClient.Login Synchronously. However, attempting to simply force synchronization don't work. Specifically:

            loginResult = oidcClient.LoginAsync(loginRequest).Result;

throws an exception: InnerException = {"Cannot change thread mode after it is set. (Exception from HRESULT: 0x80010106 (RPC_E_CHANGED_MODE))"}

I believe I can generate a simple test case if necessary, assuming there's a good generic OAuth server running somewhere I could use as a test bed.

jzkirtley avatar Apr 06 '22 14:04 jzkirtley

Any workarounds would be appreciated. Attempts to call OidcClient.LoginAsync from an invoked callback in the UI thread deadlock (which makes sense). Rewriting my entire login process to use async/await is basically a nonstarter as it's literally thousands of lines of legacy code.

jzkirtley avatar Apr 06 '22 14:04 jzkirtley

Sorry - no idea. Feel free to grab the source code and change it in any way you need.

leastprivilege avatar Apr 06 '22 14:04 leastprivilege