AcquireTokenSilentAsyn c с использованием кэшированного токена в Xamarin. Android не работает - Azure аутентификация (MSAL) - PullRequest
0 голосов
/ 14 апреля 2020

Я пытался интегрировать Azure аутентификацию AD в приложение Xamarin. Android, используя Microsoft Authenticator в качестве брокера. После того, как пользователь войдет в систему в интерактивном режиме, токен должен быть кэширован по умолчанию, что позволит в следующий раз автоматически получить его с помощью AcquireTokenSilent, без участия пользователя.

Похоже, что токен не кэшируется, поскольку IEnumerable<IAccount> accounts = await App.PCA.GetAccountsAsync(); всегда возвращает пустой список.

  private async Task AcquireTokenAsync()
        {
            AuthenticationResult authResult = null;
            **IEnumerable<IAccount> accounts = await App.PCA.GetAccountsAsync();**
            try
            {
                if (btnSignInSignOut.Text == "Sign in")
                {
                    try
                    {
                        IAccount firstAccount = accounts.FirstOrDefault();
                        authResult = await App.PCA.AcquireTokenSilent(App.Scopes, firstAccount)
                                              .ExecuteAsync();
                    }
                    catch (MsalUiRequiredException ex)
                    {
                        try
                        {
                            authResult = await App.PCA.AcquireTokenInteractive(App.Scopes)
                                                      .WithParentActivityOrWindow(App.ParentWindow)
                                                      .WithUseEmbeddedWebView(true)
                                                      .ExecuteAsync();
                        }
                        catch (Exception ex2)
                        {
                            await DisplayAlert("Acquire token interactive failed. See exception message for details: ", ex2.Message, "Dismiss");
                        }
                    }

                    if (authResult != null)
                    {
                        var content = await GetHttpContentWithTokenAsync(authResult.AccessToken);
                        UpdateUserContent(content);
                        Device.BeginInvokeOnMainThread(() => { btnSignInSignOut.Text = "Sign out"; });
                        accounts = await App.PCA.GetAccountsAsync();

                        var tokencache = App.PCA.UserTokenCache;
                    }
                }
                else
                {
                    while (accounts.Any())
                    {
                        await App.PCA.RemoveAsync(accounts.FirstOrDefault());
                        accounts = await App.PCA.GetAccountsAsync();
                    }

                    slUser.IsVisible = false;
                    Device.BeginInvokeOnMainThread(() => { btnSignInSignOut.Text = "Sign in"; });
                }
            }
            catch (Exception ex)
            {
                await DisplayAlert("Authentication failed. See exception message for details: ", ex.Message, "Dismiss");
            }
        }
...