Android-приложение PushAsync nav не работает после завершения Xamarin.Auth oidc - PullRequest
0 голосов
/ 26 сентября 2019

Я создал приложение Xamarin.Forms, которое авторизуется и аутентифицируется с помощью нашего Identity Server.Весь процесс аутентификации работает хорошо как в iOS, так и в Android - в обоих случаях я получаю токен и могу запросить наш API.

Приложение Android не принимает навигационные команды и остается "застрявшим" в целевом действии дляНастраиваемый обратный вызов URI.

В манифесте Android есть запись активности для is4.callback , и он хорошо работает:

    // The Name property here is referred to in the Activity in Android.manifest
    // https://docs.microsoft.com/en-us/xamarin/android/platform/android-manifest
    [Activity(Name = "is4.callback")]
    public class AuthCallback : Activity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

            if (Intent?.Data?.ToString() != null)
            {
                // Convert Android.Net.Url to Uri
                var uri = new Uri(Intent?.Data?.ToString());

                // Load redirectUrl page
                AuthenticationState.Authenticator.OnPageLoading(uri);

                //this.Finish();
                //return;

            } else
            {
                // deal with it
            }

        }
    }

OnPageLoading () Вызов метода выше отправляет элемент управления обратно OnAuthCompleted () для Xamarin.Auth, как и ожидалось:

        async void OnAuthCompleted(object sender, AuthenticatorCompletedEventArgs e)
        {
            if (e.Account != null && e.Account.Properties != null)
            {
                Client.DefaultRequestHeaders.Add("Authorization", $"Bearer {e.Account.Properties["access_token"]}");

                HttpResponseMessage response = await Client.GetAsync("https://our.is4.server/connect/userinfo");
                if (response != null)
                {
                    using (HttpContent content = response.Content)
                    {
                        string responseBody = await response.Content.ReadAsStringAsync();
                        Console.WriteLine(responseBody);
                    }
                    Console.WriteLine(_logStringPre + "MainPage.OnAuthCompleted(), calling nav:");
                    await Navigation.PushAsync(new HasAuth());
                }
                else
                {
                    // deal with it
                }
            }
            else
            {
                await Navigation.PushAsync(new NoAuth());
            }
        }

Однако для Android это PushAsync в представлении HasAuth непроисходит, как и ожидалось - действие, которое перехватывает обратный вызов ( is4.callback ), сохраняет фокус.Маленькая кнопка «назад» <внизу экрана на моем Pixel 3 отправляет меня на страницу <code>HasAuth, где и должен быть вид.Это последнее WriteLine до PushAsync срабатывает, я думаю, что мне нужно как-то закрыть активность Android?

Использование finish() в is4.callback предотвращает аутентификацию,return в этом действии, похоже, не оказывает никакого влияния.

I do см. Предложение "Если экран входа в CustomTabs не закрывается автоматически ..." из ОС Android, видимыйиз-за действия is4.callback , но мне кажется, что CustomTabs закрыты правильно?Чего мне не хватает?

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...