AcquireTokenInteractive вызов в приложении UWP от. NET Стандартное время сборки 2.0 истекло - PullRequest
0 голосов
/ 13 марта 2020

Создание приложения Xamarin.Forms UWP.

Вызов AcquireTokenInteractive из моего кода уровня UWP работает нормально:

var result = await app.AcquireTokenInteractive( m_scopes )
.WithPrompt( Microsoft.Identity.Client.Prompt.SelectAccount )
.ExecuteAsync( );

Я получаю встроенное веб-представление для входа и предоставляю свои учетные данные.

Однако тот же код, помещенный в сборку. NET Standard 2.0, вызываемую тем же приложением, просто зависает при вызове AcquireCodeInteractive. В конце концов время ожидания истекает, и генерируются исключения.

ВОПРОС: Почему при вызове из сборки приложения UWP наблюдается другое поведение по сравнению с NET стандартной сборкой 2.0?

Дополнительная информация ...

Из стеков исключений, представленных ниже, кажется, что проблема связана с Windows .ApplicationModel.Core.CoreApplicationView.get_CoreWindow (), поэтому требуется дополнительная осторожность для родительского окна.

На данный момент я сильно подозреваю, что объект, который я предоставляю как parentwindow (мой MainPage, который является подклассом Xamarin из Windows .UI.Xaml.Controls.Page), который должен быть IWin32Window, не является. Мне не удалось разрешить это имя на уровне Xamarin UWP.

Я в одном и том же потоке пользовательского интерфейса в обоих случаях.

Добавление .WithParentActivityOrWindow (parentwindow) не помогло. К сведению: эта функция недоступна на уровне UWP.

Добавление .WithUseEmbeddedWebView (true) не помогло.

Приложение установлено в Azure центре администратора с двумя стандартными перенаправлениями для Настольное приложение:

https://login.microsoftonline.com/common/oauth2/nativeclient

https://login.live.com/oauth20_desktop.srf

My PublicClientApplication создается следующим образом:

var app = Microsoft.Identity.Client.PublicClientApplicationBuilder.Create( myclientid )
.WithClientName( "myapp" )
.WithRedirectUri( "https://login.live.com/oauth20_desktop.srf" )
.WithLogging( ( severity, message, c ) =>
{
    McrDebug.WriteLine( message );
} )
.Build( );

При входе в систему из приложения выводятся следующие данные (записи журнала, отредактированные для краткости и конфиденциальности):

MSAL 4.9.0.0 MSAL.UAP MSAL.UAP with assembly version '4.9.0.0'. CorrelationId(...)
MSAL 4.9.0.0 MSAL.UAP N/A  
=== InteractiveParameters Data ===
LoginHint provided: False
User provided: False
UseEmbeddedWebView: NotSpecified
ExtraScopesToConsent: 
Prompt: select_account
HasCustomWebUi: False

MSAL 4.9.0.0 MSAL.UAP  
=== Request Data ===
Authority Provided? - True
Scopes - User.Read
Extra Query Params Keys (space separated) - 

MSAL 4.9.0.0 MSAL.UAP   
=== Token Acquisition (InteractiveRequest) started:

Authority Host: login.microsoftonline.com/False
MSAL 4.9.0.0 MSAL.UAP Fetching instance discovery from the network from host login.microsoftonline.com
MSAL 4.9.0.0 MSAL.UAP Resolving authority endpoints... Already resolved? - FALSE
MSAL 4.9.0.0 MSAL.UAP Attempt 1 to call WAB failed
MSAL 4.9.0.0 MSAL.UAP Exception type: System.Exception

   at Windows.ApplicationModel.Core.CoreApplicationView.get_CoreWindow()
   at Microsoft.Identity.Client.Platforms.uap.WebUI.InvokeWABOnMainThreadAsync(Uri authorizationUri, Uri redirectUri, WebAuthenticationOptions options)
   at Microsoft.Identity.Client.Utils.RetryOperationHelper.ExecuteWithRetryAsync[T](Func`1 func, Int32 maxAttempts, Nullable`1 retryInterval, Action`2 onAttemptFailed, ISet`1 allowedExceptions)
MSAL 4.9.0.0 MSAL.UAP Attempt 2 to call WAB failed
MSAL 4.9.0.0 MSAL.UAP Exception type: System.Exception

   at Windows.ApplicationModel.Core.CoreApplicationView.get_CoreWindow()
   at Microsoft.Identity.Client.Platforms.uap.WebUI.InvokeWABOnMainThreadAsync(Uri authorizationUri, Uri redirectUri, WebAuthenticationOptions options)
   at Microsoft.Identity.Client.Utils.RetryOperationHelper.ExecuteWithRetryAsync[T](Func`1 func, Int32 maxAttempts, Nullable`1 retryInterval, Action`2 onAttemptFailed, ISet`1 allowedExceptions)
MSAL 4.9.0.0 MSAL.UAP  
Exception type: System.Exception

   at Windows.ApplicationModel.Core.CoreApplicationView.get_CoreWindow()
   at Microsoft.Identity.Client.Platforms.uap.WebUI.InvokeWABOnMainThreadAsync(Uri authorizationUri, Uri redirectUri, WebAuthenticationOptions options)
   at Microsoft.Identity.Client.Utils.RetryOperationHelper.ExecuteWithRetryAsync[T](Func`1 func, Int32 maxAttempts, Nullable`1 retryInterval, Action`2 onAttemptFailed, ISet`1 allowedExceptions)
   at Microsoft.Identity.Client.Platforms.uap.WebUI.AcquireAuthorizationAsync(Uri authorizationUri, Uri redirectUri, RequestContext requestContext, CancellationToken cancellationToken)
MSAL 4.9.0.0 MSAL.UAP  
Exception type: Microsoft.Identity.Client.MsalClientException, ErrorCode: authentication_ui_failed
---> Inner Exception Details
Exception type: System.Exception

   at Windows.ApplicationModel.Core.CoreApplicationView.get_CoreWindow()
   at Microsoft.Identity.Client.Platforms.uap.WebUI.InvokeWABOnMainThreadAsync(Uri authorizationUri, Uri redirectUri, WebAuthenticationOptions options)
   at Microsoft.Identity.Client.Utils.RetryOperationHelper.ExecuteWithRetryAsync[T](Func`1 func, Int32 maxAttempts, Nullable`1 retryInterval, Action`2 onAttemptFailed, ISet`1 allowedExceptions)
   at Microsoft.Identity.Client.Platforms.uap.WebUI.AcquireAuthorizationAsync(Uri authorizationUri, Uri redirectUri, RequestContext requestContext, CancellationToken cancellationToken)
=== End of inner exception stack trace ===

   at Microsoft.Identity.Client.Platforms.uap.WebUI.AcquireAuthorizationAsync(Uri authorizationUri, Uri redirectUri, RequestContext requestContext, CancellationToken cancellationToken)
   at Microsoft.Identity.Client.Internal.AuthCodeRequestComponent.FetchAuthCodeAndPkceInternalAsync(IWebUI webUi, CancellationToken cancellationToken)
   at Microsoft.Identity.Client.Internal.AuthCodeRequestComponent.FetchAuthCodeAndPkceVerifierAsync(CancellationToken cancellationToken)
   at Microsoft.Identity.Client.Internal.Requests.InteractiveRequest.GetTokenResponseAsync(CancellationToken cancellationToken)
   at Microsoft.Identity.Client.Internal.Requests.InteractiveRequest.ExecuteAsync(CancellationToken cancellationToken)
   at Microsoft.Identity.Client.Internal.Requests.RequestBase.RunAsync(CancellationToken cancellationToken)
...