I’m trying to use the Auth0.OidcClient.WinForms to authenticate from within an Excel plugin. I’ve tried various things, but I keep getting an exception as follows:
"ActiveX control '8856f961-340a-11d0-a96b-00c04fd705a2' cannot be instantiated because the current thread is not in a single-threaded apartment."
In the previous c# library (Auth0.WinformsWPF) I could pass a wrapper to the excel window to the LoginAsync function, but I can’t see how to achieve the same with the new library. Any ideas please?
I ran across this same issue today and I think I found a good solution. Here is what I found to be the problem:
When loading an add-in to Excel 2016 I found the System.Threading.SynchronizationContext.Current was null. This changes .NETs behavior when doing async/await. In the new version of the library Auth0.OidcClient.WinForms we are taking on a new depedency: IdentityModel and IdentityModel.OidcClient2. In that library we are doing a HttpClient.GetUrl(...).ConfigureAwait(false). This happens in two spots when kicking off auth:
It seems HttpClient is thread safe and any of its method calls will create a new thread which is run on an MTA thread. After the await occurs .NET checks for a SyncrhonizationContext, and finds it to be null so it falls back to TaskScheduler.Current. Here is a nice SO answer that I read:
In the end, what I did to fix this issue was add the following code on the button click (ribbon button) just before I initialized Auth0Client and called LoginAsync().
if (SynchronizationContext.Current == null)
{
SynchronizationContext.SetSynchronizationContext(new WindowsFormsSynchronizationContext());
}