Skip to content

Commit 915ee31

Browse files
authored
Merge pull request #1010 from AzureAD/markzuber/synccontext
fix windows ui deadlock with sync context [1009]
2 parents 3d4e44e + e642871 commit 915ee31

File tree

12 files changed

+123
-167
lines changed

12 files changed

+123
-167
lines changed

src/Microsoft.Identity.Client/ApiConfig/AcquireTokenInteractiveParameterBuilder.cs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,10 +74,17 @@ internal static AcquireTokenInteractiveParameterBuilder Create(
7474
object parent)
7575
{
7676
return new AcquireTokenInteractiveParameterBuilder(publicClientApplicationExecutor)
77+
.WithCurrentSynchronizationContext()
7778
.WithScopes(scopes)
7879
.WithParent(parent);
7980
}
8081

82+
internal AcquireTokenInteractiveParameterBuilder WithCurrentSynchronizationContext()
83+
{
84+
Parameters.UiParent.SynchronizationContext = SynchronizationContext.Current;
85+
return this;
86+
}
87+
8188
/// <summary>
8289
/// Specifies if the public client application should used an embedded web browser
8390
/// or the system default browser
@@ -154,7 +161,8 @@ protected override void Validate()
154161
#if ANDROID
155162
if (_ownerWindow is Activity activity)
156163
{
157-
Parameters.UiParent.SetAndroidActivity(activity);
164+
Parameters.UiParent.Activity = activity;
165+
Parameters.UiParent.CallerActivity = activity;
158166
}
159167
else
160168
{
@@ -163,17 +171,17 @@ protected override void Validate()
163171
#elif iOS
164172
if(_ownerWindow is UIViewController uiViewController)
165173
{
166-
Parameters.UiParent.SetUIViewController(uiViewController);
174+
Parameters.UiParent.CallerViewController = uiViewController;
167175
}
168176

169177
#elif DESKTOP
170178
if (_ownerWindow is IWin32Window win32Window)
171179
{
172-
Parameters.UiParent.SetOwnerWindow(win32Window);
180+
Parameters.UiParent.OwnerWindow = win32Window;
173181
}
174182
else if (_ownerWindow is IntPtr intPtrWindow)
175183
{
176-
Parameters.UiParent.SetOwnerWindow(intPtrWindow);
184+
Parameters.UiParent.OwnerWindow = intPtrWindow;
177185
}
178186
// It's ok on Windows Desktop to not have an owner window, the system will just center on the display
179187
// instead of a parent.

src/Microsoft.Identity.Client/ApiConfig/Executors/PublicClientExecutor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ private IWebUI CreateWebAuthenticationDialog(
100100
return new CustomWebUiHandler(interactiveParameters.CustomWebUi);
101101
}
102102

103-
var coreUiParent = interactiveParameters.UiParent.CoreUiParent;
103+
var coreUiParent = interactiveParameters.UiParent;
104104

105105
#if ANDROID || iOS
106106
coreUiParent.UseEmbeddedWebview = interactiveParameters.UseEmbeddedWebView;

src/Microsoft.Identity.Client/ApiConfig/OwnerUiParent.cs

Lines changed: 0 additions & 81 deletions
This file was deleted.

src/Microsoft.Identity.Client/ApiConfig/Parameters/AcquireTokenInteractiveParameters.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,14 @@
3030
using System.Text;
3131
using Microsoft.Identity.Client.Core;
3232
using Microsoft.Identity.Client.Extensibility;
33+
using Microsoft.Identity.Client.UI;
3334

3435
namespace Microsoft.Identity.Client.ApiConfig.Parameters
3536
{
3637
internal class AcquireTokenInteractiveParameters : IAcquireTokenParameters
3738
{
3839
public Prompt Prompt { get; set; } = Prompt.SelectAccount;
39-
public OwnerUiParent UiParent { get; } = new OwnerUiParent();
40+
public CoreUIParent UiParent { get; } = new CoreUIParent();
4041
public IEnumerable<string> ExtraScopesToConsent { get; set; } = new List<string>();
4142
public bool UseEmbeddedWebView { get; set; }
4243
public string LoginHint { get; set; }

src/Microsoft.Identity.Client/Internal/Broker/IBroker.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,18 +25,17 @@
2525
//
2626
// ------------------------------------------------------------------------------
2727

28-
using Microsoft.Identity.Client.ApiConfig;
29-
using Microsoft.Identity.Client.Core;
3028
using Microsoft.Identity.Client.OAuth2;
29+
using Microsoft.Identity.Client.UI;
3130
using System.Collections.Generic;
3231
using System.Threading.Tasks;
3332

3433
namespace Microsoft.Identity.Client.Internal.Broker
3534
{
3635
internal interface IBroker
3736
{
38-
bool CanInvokeBroker(OwnerUiParent uiParent);
37+
bool CanInvokeBroker(CoreUIParent uiParent);
3938

4039
Task<MsalTokenResponse> AcquireTokenUsingBrokerAsync(Dictionary<string, string> brokerPayload);
4140
}
42-
}
41+
}

src/Microsoft.Identity.Client/Internal/Broker/NullBroker.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,9 @@
2525
//
2626
// ------------------------------------------------------------------------------
2727

28-
using Microsoft.Identity.Client.ApiConfig;
29-
using Microsoft.Identity.Client.Core;
3028
using Microsoft.Identity.Client.Exceptions;
3129
using Microsoft.Identity.Client.OAuth2;
30+
using Microsoft.Identity.Client.UI;
3231
using System;
3332
using System.Collections.Generic;
3433
using System.Threading.Tasks;
@@ -40,7 +39,7 @@ namespace Microsoft.Identity.Client.Internal.Broker
4039
/// </summary>
4140
internal class NullBroker : IBroker
4241
{
43-
public bool CanInvokeBroker(OwnerUiParent uiParent)
42+
public bool CanInvokeBroker(CoreUIParent uiParent)
4443
{
4544
return false;
4645
}

src/Microsoft.Identity.Client/Platforms/iOS/iOSBroker.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
using CoreFoundation;
3737
using Microsoft.Identity.Client.OAuth2;
3838
using Microsoft.Identity.Client.Internal.Broker;
39-
using Microsoft.Identity.Client.ApiConfig;
39+
using Microsoft.Identity.Client.UI;
4040

4141
namespace Microsoft.Identity.Client.Platforms.iOS
4242
{
@@ -55,15 +55,15 @@ public iOSBroker(IServiceBundle serviceBundle)
5555
_serviceBundle = serviceBundle;
5656
}
5757

58-
public bool CanInvokeBroker(OwnerUiParent uiParent)
58+
public bool CanInvokeBroker(CoreUIParent uiParent)
5959
{
6060
if (uiParent == null)
6161
{
6262
_serviceBundle.DefaultLogger.Error(iOSBrokerConstants.UiParentIsNullCannotInvokeBroker);
6363
return false;
6464
}
6565

66-
if (uiParent.CoreUiParent.CallerViewController == null)
66+
if (uiParent.CallerViewController == null)
6767
{
6868
_serviceBundle.DefaultLogger.Error(iOSBrokerConstants.CallerViewControllerIsNullCannotInvokeBroker);
6969
return false;
@@ -73,7 +73,7 @@ public bool CanInvokeBroker(OwnerUiParent uiParent)
7373

7474
var result = false;
7575

76-
uiParent.CoreUiParent.CallerViewController.InvokeOnMainThread(() =>
76+
uiParent.CallerViewController.InvokeOnMainThread(() =>
7777
{
7878
result = UIApplication.SharedApplication.CanOpenUrl(new NSUrl(BrokerParameter.BrokerV2));
7979
});
@@ -218,4 +218,4 @@ public static void SetBrokerResponse(NSUrl responseUrl)
218218
brokerResponseReady.Release();
219219
}
220220
}
221-
}
221+
}

src/Microsoft.Identity.Client/Platforms/net45/InteractiveWebUI.cs

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
//----------------------------------------------------------------------
1+
//----------------------------------------------------------------------
22
//
33
// Copyright (c) Microsoft Corporation.
44
// All rights reserved.
@@ -25,27 +25,32 @@
2525
//
2626
//------------------------------------------------------------------------------
2727

28+
using Microsoft.Identity.Client.Core;
2829
using Microsoft.Identity.Client.UI;
2930

3031
namespace Microsoft.Identity.Client.Platforms.net45
3132
{
3233
internal class InteractiveWebUI : WebUI
3334
{
34-
#pragma warning disable 618 // WindowsFormsWebAuthenticationDialog is marked obsolete
35+
private WindowsFormsWebAuthenticationDialog _dialog;
3536

36-
private WindowsFormsWebAuthenticationDialog dialog;
37+
public InteractiveWebUI(CoreUIParent parent, RequestContext requestContext)
38+
{
39+
OwnerWindow = parent?.OwnerWindow;
40+
SynchronizationContext = parent?.SynchronizationContext;
41+
RequestContext = requestContext;
42+
}
3743

3844
protected override AuthorizationResult OnAuthenticate()
3945
{
4046
AuthorizationResult result;
4147

42-
using (dialog = new WindowsFormsWebAuthenticationDialog(OwnerWindow) {RequestContext = RequestContext})
48+
using (_dialog = new WindowsFormsWebAuthenticationDialog(OwnerWindow) {RequestContext = RequestContext})
4349
{
44-
result = dialog.AuthenticateAAD(RequestUri, CallbackUri);
50+
result = _dialog.AuthenticateAAD(RequestUri, CallbackUri);
4551
}
4652

4753
return result;
4854
}
49-
#pragma warning restore 618
5055
}
51-
}
56+
}

src/Microsoft.Identity.Client/Platforms/net45/NetDesktopWebUIFactory.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,10 @@ public IWebUI CreateAuthenticationDialog(CoreUIParent parent, RequestContext req
3636
{
3737
if (parent.UseHiddenBrowser)
3838
{
39-
return new SilentWebUI {OwnerWindow = parent?.OwnerWindow, RequestContext = requestContext};
39+
return new SilentWebUI(parent, requestContext);
4040
}
4141

42-
return new InteractiveWebUI {OwnerWindow = parent?.OwnerWindow, RequestContext = requestContext};
42+
return new InteractiveWebUI(parent, requestContext);
4343
}
4444
}
45-
}
45+
}

0 commit comments

Comments
 (0)