Я создал приложение 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 закрыты правильно?Чего мне не хватает?
Спасибо!