Я пытался интегрировать 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");
}
}