Проблемы с аутентификацией в MSAL и Azure B2C в приложении Xamarin.Forms - PullRequest
0 голосов
/ 06 октября 2018

У меня возникли трудности с получением одного из примеров приложений Xamarin.Forms / Azure для работы с моим собственным клиентом Azure B2C, в частности active-directory-b2c-xamarin-native .

Мне удалось получить образец для работы из коробки, мое единственное изменение - обновить все пакеты XF NuGet.На этом этапе обе версии для Android (на моем Google Pixel) и UWP работали отлично;на iOS я смог войти / выйти и отредактировать профиль (у него все еще есть известная проблема, что iPhoneSimulator неправильно сохраняет токены в цепочке для ключей, поэтому API и кеширование не работают, но я игнорирую это длясейчас, пока я не смогу получить настоящий iPhone).Проблемы начались, когда я попытался настроить и использовать своего собственного клиента B2C в соответствии с инструкциями в файле readme.Поскольку оригинальный пример работает, можно с уверенностью предположить, что код в порядке;единственные изменения, которые я сделал, касались волшебных строк в верхней части App.cs и URI перенаправления, хранящегося в AndroidManifest.xml и Info.plist.Таким образом, рабочая теория заключается в том, что я либо ввел одну из этих строк неправильно, либо неправильная настройка B2C.Я прошел через это несколько раз, и я не могу найти проблему.Я готов поспорить, что все они вызваны одной и той же ошибкой с моей стороны.

Проблема 1 (решена). Приложение UWP не разрешает вход в систему.Вместо этого, когда открывается встроенный браузер, я получаю сообщение «Мы не можем подключиться к услуге, которая вам нужна прямо сейчас. Проверьте сетевое подключение или повторите попытку позже», после чего следует диалоговое окно «MsalException: WAB-аутентификация не удалась», как только я закрываюbrowser.

Это была единственная проблема, которую мне удалось исправить, либо закомментировав эту строку в конструкторе UWP.MainPage:

UserDetailsClient.Core.App.PCA.RedirectUri = WebAuthenticationBroker.GetCurrentApplicationCallbackUri().ToString();

, либо добавив значение, возвращаемоевызов GetCurrentApplicationCallbackUri () (что-то вроде «ms-app: // s-1-15-2-900855338 ....») в список пользовательских перенаправлений URI приложения пользовательского интерфейса в B2C.Я бы предпочел просто удалить строку кода, но возникает вопрос о том, зачем эта строка кода была нужна в первую очередь.Возможно, кто-то может подсказать, почему использование перенаправления ms-app: // на бэкэнде может быть предпочтительнее, чем msalXXXX: // auth, используемый другими платформами.Я понятия не имею, почему оригинальный пример работал с ms-app: // redirect;возможно, эта строка на самом деле постоянна во всех приложениях и уже определена в образце B2C-клиента.

Проблема 2. После решения проблемы входа в систему UWP теперь все работает на этой платформе, КРОМЕ для вызова API.Я получаю 401 Несанкционированный.

Код API взят прямо из учебного пособия Разработка мобильных приложений с подключением к облаку с помощью Xamarin и Microsoft Azure ;это всего лишь бэкэнд из главы 1, с атрибутом [Authorize], добавленным в TodoItemController.(Между прочим, весь код главы 1 работает). Аутентификация службы приложений все еще отключена на самом API (не на клиенте B2C) в Azure.Если я удаляю атрибут Authorize из TodoItemController, он работает, при условии, что я также передаю дополнительный заголовок ZUMO-API-VERSION = 2.0.0.Однако добавление заголовка не помогает с 401.

Так как я могу войти в систему, я предполагаю, что у меня есть действительный токен доступа, это просто не то, что ожидает серверная часть.Опять же, это работает на примере, поэтому я не знаю, чем отличается мое приложение.Я подозреваю, что эта проблема также влияет на iOS и Android, но я не уверен, потому что не могу завершить вход на этих платформах.Что приводит меня к ...

Задача 3. На Android и iOS при нажатии кнопки «ВХОД» приложение открывает системный браузер, и я могу войти в систему, но при последующем перенаправлениине происходит, и приложение остается в исходном состоянии.При отладке строка после вызова App.PCA.AcquireTokenAsync () никогда не достигается.Никаких исключений не возникает.

Из того, что я понимаю, это обычно происходит из-за неправильного формирования URI перенаправления или из-за того, что вы забыли добавить код перенаправления для конкретной платформы (intent-filter в Android или OpenUrl в iOS).Я дважды проверил URI с полдюжины раз, и код должен быть правильным, так как пример работал.Я заметил запись ActivityManager START в журнале Android, поэтому браузер отправляет перенаправление, но приложение по какой-либо причине не отвечает на него.Также обратите внимание, что UWP-клиент работает, используя тот же URI msalXXXX: // auth (именно поэтому я попытался объяснить проблему 1 выше)


Visual Studio 2017 15.8.6Xamarin.Forms 3.2.0.871581Microsoft.Identity.Client 1.1.4-preview


Ниже приведен список строк из App.cs, а также скриншоты из моей настройки B2C.Любая помощь будет принята с благодарностью!

    public static string Tenant = "myapp.onmicrosoft.com";
    public static string ClientID = "d43c8xxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx";
    public static string PolicySignUpSignIn = "B2C_1_emailPolicy";
    public static string PolicyEditProfile = "B2C_1_profileEditPolicy";
    public static string PolicyResetPassword = "B2C_1_passwordResetPolicy";

    public static string[] Scopes = { "https://myapp.onmicrosoft.com/api/read" };
    public static string ApiEndpoint = "https://myapp.azurewebsites.net/tables/todoItem";

    public static string AuthorityBase = $"https://login.microsoftonline.com/tfp/{Tenant}/";
    public static string Authority = $"{AuthorityBase}{PolicySignUpSignIn}";
    public static string AuthorityEditProfile = $"{AuthorityBase}{PolicyEditProfile}";
    public static string AuthorityPasswordReset = $"{AuthorityBase}{PolicyResetPassword}";

B2C setup for API B2C setup for Xamarin.Forms UI

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