Я использую библиотеку 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, и он говорит, что согласие на вышеуказанное выражение уже предоставлено. Я прошел через несколько документов, но не повезло. Может кто-нибудь предоставить какие-либо указатели?
PS Выше приведено конвергентное приложение, которое поддерживает нативное приложение, и причина, по которой я не использую AcquireTokenSilentAsync, заключается в том, что я хочу, чтобы несколько учетных записей MSA могли входить в приложение, установленное на одном устройстве.
Редактировать: я пытался использовать PublicClientApplication без кэша токена (таким образом, используя библиотеку по умолчанию), и все еще наблюдается то же поведение. Чтобы лучше понять поведение, я захватил трассировку Fiddler во время входа в систему MSA с использованием MSAL. Из приведенной ниже трассировки наблюдаются обращения к /Consent/Update, что и является причиной того, что запрашивается согласие при каждом входе в систему. Есть идеи, как это отключить?
Разработчики и ПО из команды MSA подтвердили, что это ожидаемое поведение. Они обновили документацию, чтобы отразить эту информацию. Вот соответствующий раздел из документа:
Подводя итог, можно сказать, что если ваши пользователи используют приложение с одной учетной записью MSA на устройство, то рекомендуемый шаблон использования MSAL гарантирует, что согласие будет запрашиваться у пользователя только один раз [если кэш не будет каким-либо образом удален]. Если ваши пользователи работают с несколькими учетными записями MSA на одно устройство, вы можете использовать приложение Public Client (созданное с использованием существующего кеша токенов), чтобы получить список учетных записей MSA, для которых кешируется токен. Используя пользовательский интерфейс, вы можете предоставить пользователю список учетных записей и, основываясь на его/ее выборе, получить токен доступа в автоматическом режиме, тем самым предотвращая экран согласия. Обратите внимание, что согласие может быть подчинено только до тех пор, пока остается кеш токена. Удаление файла кэша токена вынудит пользователя повторно войти в систему с согласия.
UIBehavior
по умолчанию будетSelectAccount
. Можете ли вы попробовать использоватьAcquireTokenAsync(IEnumerable<String>, String, UIBehavior, String)
и явно передатьUIBehavior
качествеSelectAccount
и проверить?