MSAL требует согласия пользователя для каждого входа в систему для WPF Desktop Application.

2

Я использую библиотеку MSAL.NET в приложении WPF для получения токена доступа для учетных записей MSA с использованием интерактивного рабочего процесса получения токена. Ниже приведен соответствующий код для получения токена:

PublicClientApplication PublicClientApp = new PublicClientApplication("The-Application-Id", "https://login.microsoftonline.com/consumers/", TokenCacheHelper.GetUserCache());
var authResult = await publicClientApplication.AcquireTokenAsync(new string[] { "email" });

где TokenCacheHelper взят из документации. Это работает нормально, и я могу получить токен доступа и идентификационный токен в результате. Но если в следующий раз я войду в систему с использованием той же учетной записи, мне снова придется дать согласие на профиль и области электронной почты. Независимо от того, сколько раз я входил в систему и давал согласие, он все еще спрашивает меня о согласии. Я проверил свой текущий статус на account.live, и он говорит, что согласие на вышеуказанное выражение уже предоставлено. Я прошел через несколько документов, но не повезло. Может кто-нибудь предоставить какие-либо указатели?

Изображение 174551

PS Выше приведено конвергентное приложение, которое поддерживает нативное приложение, и причина, по которой я не использую AcquireTokenSilentAsync, заключается в том, что я хочу, чтобы несколько учетных записей MSA могли входить в приложение, установленное на одном устройстве.

Редактировать: я пытался использовать PublicClientApplication без кэша токена (таким образом, используя библиотеку по умолчанию), и все еще наблюдается то же поведение. Чтобы лучше понять поведение, я захватил трассировку Fiddler во время входа в систему MSA с использованием MSAL. Из приведенной ниже трассировки наблюдаются обращения к /Consent/Update, что и является причиной того, что запрашивается согласие при каждом входе в систему. Есть идеи, как это отключить?

Изображение 174551

  • 0
    Это странно. Согласно этому UIBehavior по умолчанию будет SelectAccount . Можете ли вы попробовать использовать AcquireTokenAsync(IEnumerable<String>, String, UIBehavior, String) и явно передать UIBehavior качестве SelectAccount и проверить?
  • 0
    Да, это действительно странно. Я пытался использовать UIBehavior в качестве SelectAccount, но после ввода данных для входа в систему пользователь должен дать согласие. Кроме того, я декомпилировал код и увидел, что поведение пользовательского интерфейса по умолчанию - Выбор учетной записи.
Теги:
authentication
wpf
azure-active-directory
msal

1 ответ

0
Лучший ответ

Разработчики и ПО из команды MSA подтвердили, что это ожидаемое поведение. Они обновили документацию, чтобы отразить эту информацию. Вот соответствующий раздел из документа:

Изображение 174551

Подводя итог, можно сказать, что если ваши пользователи используют приложение с одной учетной записью MSA на устройство, то рекомендуемый шаблон использования MSAL гарантирует, что согласие будет запрашиваться у пользователя только один раз [если кэш не будет каким-либо образом удален]. Если ваши пользователи работают с несколькими учетными записями MSA на одно устройство, вы можете использовать приложение Public Client (созданное с использованием существующего кеша токенов), чтобы получить список учетных записей MSA, для которых кешируется токен. Используя пользовательский интерфейс, вы можете предоставить пользователю список учетных записей и, основываясь на его/ее выборе, получить токен доступа в автоматическом режиме, тем самым предотвращая экран согласия. Обратите внимание, что согласие может быть подчинено только до тех пор, пока остается кеш токена. Удаление файла кэша токена вынудит пользователя повторно войти в систему с согласия.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню