Создание приложения 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)