Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Для интерактивного получения токена требуется, чтобы пользователь взаимодействовал с диалоговым окном аутентификации, которое открывается в браузере, запускаемом MSAL. В отличие от этого, в веб-приложении пользователь перенаправляется на страницу авторизации и используется другой API. Диалоговое окно проверки подлинности может запрашивать учетные данные, изменения паролей, многофакторную проверку подлинности и т. д. — поток и визуальное содержимое управляются службой.
В MSAL.NET метод, используемый для интерактивного получения токена, — AcquireTokenInteractive(IEnumerable<String>).
В следующем примере показан минимальный код для получения токена, используемого для чтения профиля пользователя с помощью Microsoft Graph:
string[] scopes = new string[] { "user.read" };
var app = PublicClientApplicationBuilder.Create("YOUR_CLIENT_ID")
.WithDefaultRedirectUri()
.Build();
var accounts = await app.GetAccountsAsync();
AuthenticationResult result;
try
{
result = await app.AcquireTokenSilent(scopes, accounts.FirstOrDefault())
.ExecuteAsync();
}
catch (MsalUiRequiredException)
{
result = await app.AcquireTokenInteractive(scopes).ExecuteAsync();
}
Note
Чтобы использовать AcquireTokenSilent(IEnumerable<String>, IAccount), разработчику необходимо настроить кэш токенов. Без кэша маркеров интерактивный запрос всегда будет отображаться после перезапуска приложения, даже если пользователь ранее вошел в систему. Дополнительные сведения о настройке кэша токенов см. в статье Сериализация кэша токенов в MSAL.NET.
Использование брокеров
Рекомендуемый подход для проверки подлинности пользователей — использовать брокеры, а не браузеры, например диспетчер веб-учетных записей (WAM) на Windows. WAM позволяет разработчикам легко подключать свое приложение к личным или Microsoft Entra ID учетным записям, уже подключенным к Windows. Кроме того, брокеры обеспечивают более высокий уровень безопасности благодаря защите токенов.
Необходимые параметры
AcquireTokenInteractive(IEnumerable<String>) имеет только один обязательный параметр — scopesкоторый содержит перечисление строк, определяющих области, для которых требуется маркер. Если маркер предназначен для Microsoft Graph, необходимые области можно найти в справочнике по API каждого Microsoft Graph API в разделе "Разрешения". Например, чтобы получить список контактов пользователя, необходимо использовать области действия User.Read и Contacts.Read. Дополнительные сведения см. в справочнике по разрешениям Microsoft Graph.
В Android также необходимо указать родительскую Activity с помощью WithParentActivityOrWindow(Func<IntPtr>), чтобы после завершения этого взаимодействия токен вернулся в родительскую Activity. Если это не указать, будет выброшено исключение.
Необязательные параметры
СРодительскойАктивностьюИлиОкном
AcquireTokenInteractive(IEnumerable<String>)имеет один необязательный параметр, позволяющий разработчикам предоставлять ссылку на родительский компонент пользовательского интерфейса (например, окно в Windows, действие в Android). Этот родительский пользовательский интерфейс указывается с помощью WithParentActivityOrWindow(Func<IntPtr>). Диалоговое окно пользовательского интерфейса обычно будет сосредоточено на этом родительском элементе. Как указано выше, в Android родительская активность является обязательным параметром.
WithParentActivityOrWindow(Func<IntPtr>) имеет другой тип аргумента в зависимости от платформы, в которой она используется:
// Android
WithParentActivityOrWindow(Activity activity)
// .NET Framework
WithParentActivityOrWindow(IntPtr windowPtr)
WithParentActivityOrWindow(IWin32Window window)
// macOS
WithParentActivityOrWindow(NSWindow window)
// iOS
WithParentActivityOrWindow(IUIViewController viewController)
// .NET Standard (this will be on all platforms at runtime, but only on .NET Standard at build time)
WithParentActivityOrWindow(object parent).
Примечания:
В .NET Standard ожидается
object:-
Activityна Android. -
UIViewControllerв iOS. -
IntPrв Windows — см. рекомендации по дескрипторам родительского окна.
-
В Windows необходимо вызвать AcquireTokenInteractive(IEnumerable<String>) из потока пользовательского интерфейса, чтобы встроенный браузер получил соответствующий контекст синхронизации пользовательского интерфейса. Вызов не из потока пользовательского интерфейса может привести к неправильной обработке сообщений и (или) к взаимоблокировкам в пользовательском интерфейсе. Один из способов достижения этого, если вы не находитесь в потоке пользовательского интерфейса, — использовать Dispatcher.
result = await app.AcquireTokenInteractive(scopes) .WithParentActivityOrWindow(new WindowInteropHelper(this).Handle) .ExecuteAsync();
С подсказкой
WithPrompt(Prompt) используется для управления поведением интерактивного запроса проверки подлинности.
В вызове можно указать одно из возможных Prompt значений:
-
SelectAccount— заставит службу токенов показать диалоговое окно выбора учетной записи со списком учетных записей, для которых у пользователя есть активный сеанс. Это полезно, когда разработчики приложений хотят предоставить пользователю возможность выбирать между различными учётными записями, доступными на компьютере. Это делается путем отправкиprompt=select_accountпоставщику удостоверений. Это конфигурация по умолчанию и обеспечивает оптимальный интерфейс на основе доступных сведений (например, учетной записи, присутствия сеанса для пользователя). Обычно это значение не следует изменять. -
Consent— позволяет разработчику приложения принудительно запрашивать согласие пользователя, даже если ранее было предоставлено согласие. Это делается путем отправкиprompt=consentпоставщику удостоверений. Это можно использовать в некоторых приложениях, ориентированных на безопасность, когда управление организацией требует, чтобы пользователь предоставил диалоговое окно согласия при каждом использовании приложения. -
ForceLogin— позволяет разработчику приложения запрашивать учетные данные службы, даже если это не требуется. Это может быть полезно, если не удаётся получить токен и разработчик хочет позволить пользователю снова войти в систему. Это делается путем отправкиprompt=loginпоставщику удостоверений. Это в основном используется в некоторых приложениях, ориентированных на безопасность, когда управление организацией требует, чтобы пользователь входить каждый раз, когда он обращается к определенным частям приложения. -
Create— запускает процесс регистрации, который используется для внешних удостоверений, отправляяprompt=createпоставщику удостоверений. Это доступно в MSAL.NET 4.29.0+. Этот запрос не следует отправлять для приложений Azure AD B2C. Дополнительные сведения см. в разделе Добавление потока регистрации для пользователя самообслуживания. -
Never(только для .NET 4.5 и WinRT) — не будет запрашивать пользователя, а вместо этого попытается использовать файл cookie, сохраненный в скрытом встроенном веб-представлении. Это может завершиться ошибкой, и в этом случае AcquireTokenInteractive(IEnumerable<String>) вызовет исключение, чтобы указать, что требуется взаимодействие с интерфейсом пользователя. -
NoPrompt— не будет отправлять запрос поставщику удостоверений. Это полезно только для политик редактирования профиля Azure AD B2C (см. раздел Использование MSAL.NET для входа пользователей с социальными учетными записями).
С использованием встроенного WebView
Использование WithUseEmbeddedWebView(Boolean) позволяет разработчикам указать, следует ли принудительно использовать внедренное веб-представление или системный браузер (если он доступен). Внедренное веб-представление — это всплывающее окно, содержащее компонент WebView1 или WebView2 в зависимости от конфигурации клиента. Дополнительные сведения см. в разделе "Использование веб-браузеров (MSAL.NET) и использование WebView2 с MSAL.NET.
Можно указать, будет ли использоваться встроенное веб-представление при получении токена:
result = await app.AcquireTokenInteractive(scopes)
.WithUseEmbeddedWebView(true)
.ExecuteAsync();
Note
Использование встроенного веб-представления с центрами авторизации Microsoft Entra ID всегда приводит к использованию устаревшего механизма веб-представления (WebView1), что может нарушить сценарии, в которых разработчики используют Windows Hello или аутентификацию FIDO.
С дополнительными областями для согласия
WithExtraScopesToConsent(IEnumerable<String>)это полезно в расширенном сценарии, когда разработчик хочет, чтобы пользователь предварительно дал согласие на несколько ресурсов заранее и не должен использовать добавочное согласие, которое обычно используется с платформа удостоверений Майкрософт. Подробнее см. ниже: Практическое руководство: как заранее получить согласие пользователя на доступ к нескольким ресурсам
var result = await app.AcquireTokenInteractive(scopesForCustomerApi)
.WithExtraScopeToConsent(scopesForVendorApi)
.ExecuteAsync();
Поддержка веб-браузеров
| Browser | Про | Против |
|---|---|---|
| Embedded WebView1 (на основе Internet Explorer) | — Поставляется со всеми поддерживаемыми версиями Windows — Используется библиотеками идентификации более 10 лет |
— нет поддержки FIDO (например, YubiKey) - Нет поддержки Windows Hello — проблемы условного доступа в старых версиях Windows — Только Windows |
| Embedded WebView2 (на основе Microsoft Edge) | — поддержка FIDO и Windows Hello | — Проблемы условного доступа в некоторых старых версиях Windows. — Только Windows |
| Системный браузер | — использует системный браузер по умолчанию. — Chrome, Edge и Firefox имеют интеграцию с условным доступом, Windows Hello и FIDO. — работает на macOS, Linux и каждой возможной версии Windows. |
— несколько разрушительный пользовательский интерфейс (контекст переключается на браузер). |
| Брокер Windows | — поддержка политик FIDO, Windows Hello и условного доступа. — Полностью интегрирована с Windows. - Улучшена безопасность. — долгосрочный стратегический компонент для проверки подлинности на Windows. |
— Устаревшая конфигурация MSA-passthrough не работает. Рекомендуется создать новое приложение, если вы отойдете от MSA-passthrough. — только Windows (только 10+, Server 2016 и Server 2019+). |
Как сделать
Заранее получите согласие пользователя для нескольких ресурсов
Note
Получение согласия для нескольких ресурсов работает для Microsoft Entra ID, но не для Microsoft Entra B2C. В сценарии B2C поддерживается только согласие администратора.
Конечная точка доступа Microsoft Entra ID не позволяет получить токен сразу для нескольких ресурсов. Параметр областей должен содержать только области для одного ресурса. Однако разработчики могут обеспечить предварительное согласие пользователя на несколько ресурсов с помощью аргумента extraScopesToConsent .
Например, если есть два ресурса, у которых есть две области:
-
https://mytenant.onmicrosoft.com/customerapi(с 2 областями видимостиcustomer.readиcustomer.write) -
https://mytenant.onmicrosoft.com/vendorapi(с 2 областямиvendor.readиvendor.write)
Приложение должно использовать функцию WithExtraScopesToConsent(IEnumerable<String>) при интерактивном получении токена, у которой есть аргумент extraScopesToConsent:
string[] scopesForCustomerApi = new string[]
{
"https://mytenant.onmicrosoft.com/customerapi/customer.read",
"https://mytenant.onmicrosoft.com/customerapi/customer.write"
};
string[] scopesForVendorApi = new string[]
{
"https://mytenant.onmicrosoft.com/vendorapi/vendor.read",
"https://mytenant.onmicrosoft.com/vendorapi/vendor.write"
};
var accounts = await app.GetAccountsAsync();
var result = await app.AcquireTokenInteractive(scopesForCustomerApi)
.WithAccount(accounts.FirstOrDefault())
.WithExtraScopesToConsent(scopesForVendorApi)
.ExecuteAsync();
Это позволит получить токен доступа для первого веб-API. При вызове второго API его можно сделать следующим образом:
AcquireTokenSilent(scopesForVendorApi, accounts.FirstOrDefault()).ExecuteAsync();
Личные учетные записи Майкрософт
Для личных учетных записей Microsoft повторный запрос согласия при каждом запросе авторизации из собственного клиента — это ожидаемое поведение. Идентификация нативного клиента по своей природе небезопасна, и платформа идентификации Майкрософт решила снизить этот риск в потребительских службах, запрашивая согласие при каждой авторизации приложения.
Сведения о конкретной платформе
В зависимости от платформы для интерактивных запросов может потребоваться дополнительная конфигурация:
- Требования к конфигурации и советы по устранению неполадок Xamarin Android с MSAL.NET
- Рекомендации по использованию Xamarin iOS с MSAL.NET
Samples
| Sample | Platform | Description |
|---|---|---|
| active-directory-dotnet-desktop-msgraph-v2 | Рабочий стол (WPF) | Настольное приложение Windows .NET (WPF), вызывающее Microsoft API Graph.
|
| https://github.com/Azure-Samples/active-directory-dotnet-native-aspnetcore-v2 | WPF, веб-API ASP.NET Core 2.0 | Приложение WPF, вызывающее веб-API ASP.NET Core с помощью Azure AD версии 2.0.
|