Я играю с предварительным просмотром версии 1.1.2 MSAL (Microsoft Identity Client) и застрял во время процесса входа, когда он не перенаправляет мое приложение обратно в приложение Android.
Мое приложение Xamarin - это приложение для Android, созданное с помощью Prism, и я считаю, что у меня все отсортировано.
В файле App.xaml.cs имейте:
public static UIParent UiParent { get; set; }
public static PublicClientApplication ClientApplication { get; set; }
public static string[] Scopes = { "User.Read" };
Затем в конструкторе приложения у меня есть:
public App(IPlatformInitializer initializer) : base(initializer)
{
ClientApplication = new PublicClientApplication("my-app-id");
}
Учтите, что это приложение, созданное с помощью Prism.
Затем в моем файле MainPageViewModel.cs у меня есть команда, запускающая нажатие кнопки, со следующим кодом:
private async void OnAuthenticate()
{
try
{
var result = await App.ClientApplication.AcquireTokenAsync(App.Scopes, App.UiParent);
Message = $"Welcome {result.User.Name}";
}
catch (MsalException ex)
{
Message = ex.Message;
}
}
Чтобы правильно проанализировать UIParent, я обновил файл MainActivity.cs в проекте Droid, чтобы:
protected override void OnCreate(Bundle bundle)
{
// omitted...
LoadApplication(new App(new AndroidInitializer()));
App.UiParent = new UIParent(this);
}
а также:
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
base.OnActivityResult(requestCode, resultCode, data);
AuthenticationContinuationHelper.SetAuthenticationContinuationEventArgs(requestCode, resultCode, data);
}
Если я отменяю процесс входа, я получаю сообщение «Пользователь отменил аутентификацию», что правильно, но процесс входа никогда не перенаправляет меня обратно в приложение Android.
URI перенаправления в моем приложении следующий:
msal{my-app-id}://auth
что, согласно большинству блогов, которые я читал по MSAL и Xamarin, так и должно быть.
Не знаю, почему у меня не работает?
Вам необходимо обновить манифест Android, чтобы «получить» обратный вызов на указанный uri перенаправления. У меня MSAL работал только со стандартной учетной записью Windows, я не мог заставить его работать с VSTS, потому что приложения VSTS требуют физического uri, и, похоже, MSAL не может с этим справиться.





Как уже упоминал JadedEric, речь идет об обновлении файла AndroidManifest.xml для Android, а для IOS - об обновлении файла info.plist. пожалуйста, посмотрите следующий пост, поскольку они объясняют, что именно помещать в эти файлы: https://github.com/Azure-Samples/active-directory-xamarin-native-v2
Еще одна важная вещь здесь заключается в том, что вы должны убедиться, что ваше приложение, зарегистрированное в azure, имеет тот же RedirectURI, что и тот, который помещен в manfiest.xml и info.plist. это ключ к работе этого перенаправления (это msal{my-app-id}://auth, о котором вы упомянули выше)
Предлагаю, чтобы вы не обновили файл AndroidManifest.xml с помощью URL-адреса возврата "мсал {clientID}".
например.:
<data android:scheme = "msalxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" android:host = "auth" />
Недавно я столкнулся с той же проблемой с решением образец, предоставленным на github.
Первоначальный ответ выше - один из вариантов, но этот ссылка на сайт от Microsoft лучше объясняет его с помощью примера кода. Вы можете обновить манифест Android:
<activity android:name = "microsoft.identity.client.BrowserTabActivity">
<intent-filter>
<action android:name = "android.intent.action.VIEW" />
<category android:name = "android.intent.category.DEFAULT" />
<category android:name = "android.intent.category.BROWSABLE" />
<data android:scheme = "msal{client_id}" android:host = "auth" />
</intent-filter>
</activity>
или создайте действие в коде:
[Activity]
[IntentFilter(new[] { Intent.ActionView },
Categories = new[] { Intent.CategoryBrowsable, Intent.CategoryDefault },
DataHost = "auth",
DataScheme = "msal{client_id}")]
public class MsalActivity : BrowserTabActivity
{
}
В любом случае, как только идентификатор клиента установлен правильно, он должен перенаправить обратно в ваше приложение.
Хотя эта ссылка может дать ответ на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если ссылка на страницу изменится.
Хороший вопрос, я тоже пытаюсь найти ответ на него ... Если я найду что-нибудь плохое, дайте вам знать