ADAL AcquireToken проверка подлинности Windows UWP

Я разрабатываю приложение UWP, которое должно проходить аутентификацию на локальном экземпляре ADFS 2016, но с использованием встроенной аутентификации Windows.

Я использую ADAL 3.19.8. Приложение работает на устройстве Windows 10, к которому присоединен домен. В приложении включены возможности корпоративной аутентификации, частной сети (клиент и сервер) и сертификаты общего пользователя, как указано здесь: https://github.com/AzureAD/microsoft-authentication-library-for-dotnet/wiki/uwp-specificities

Я устанавливаю для флага UseCorporateNetwork значение true. Встроенная проверка подлинности Windows включена в окне "Свойства обозревателя", и я добавил сервер ADFS в зону локальной интрасети.

Вот как я пытаюсь аутентифицироваться:

string authority = "https://xxxx/adfs/oauth2";
const bool useCorporateNetwork = true;
var authContext = new AuthenticationContext(authority, false);
var authResult = await authContext.AcquireTokenAsync(
        resourceURI, 
        clientID, 
        new Uri(clientReturnURI), 
        new PlatformParameters(PromptBehavior.Auto, useCorporateNetwork));

Аутентификация по ADFS прошла успешно, и я получаю токены доступа и идентификатора. Однако приложение всегда отображает экран входа в ADFS. Чтобы продолжить, я ввожу те же самые имя пользователя и пароль, которые я использовал для входа в Windows. Очевидно, что это не идеальный вариант, и это не то поведение, которое пользователи приложения хотели бы видеть.

Используя Fiddler, я вижу, что приложение UWP вызывает https://xxxx/adfs/oauth2/authorize.

Я могу получить ожидаемое поведение единого входа, если использую приведенный выше код, но в приложении WinForms (хотя перегрузка useCorporateNetwork отсутствует). Используя Fiddler, приложение WinForms вызывает https://xxxx/adfs/oauth2/authorize/wia

Что мне не хватает?

2 ответа

Решение

Бит, который я пропустил, оказался тем, что вам нужно заполучить Uri перенаправления клиента из WebAuthenticationBroker вместо того, чтобы устанавливать его в произвольную строку:

Uri clientReturnURI = Windows.Security.Authentication.Web
    .WebAuthenticationBroker.GetCurrentApplicationCallbackUri();

Это возвращает URI, такой как ms-app://s-1-15-2-1352796503-54529114-405753024-3540103335-3203256200-511895534-1429095407/, и это должно быть зарегистрировано в ADFS для собственного приложения.

Эта статья была полезна: https://github.com/AzureAD/azure-activedirectory-library-for-dotnet/wiki/Acquiring-tokens-interactively---Public-client-application-flows

Это соответствующий раздел:

Свойства PlatformParameter, специфичные для WinRT и UWP (корпоративная сеть)

Платформы WinRT (до ADAL 3.x) и UWP имеют следующее свойство UseCorporateNetwork - логическое значение, которое позволяет приложениям Win8.1 и UWP использовать преимущества встроенной аутентификации Windows (и, следовательно, единого входа с пользователем, вошедшим в операционную систему). если этот пользователь вошел в систему с учетной записью в федеративном клиенте Azure AD. Это использует WAB (брокер веб-аутентификации).

Важное замечание: Если для этого свойства установлено значение true, предполагается, что разработчик приложения включил встроенную проверку подлинности Windows (WIA) в приложении. За это:

В Package.appxmanifest для вашего приложения UWP на вкладке "Возможности" включите следующие возможности: Общий сертификат пользователя для частных сетей (клиент и сервер) WIA не включен по умолчанию, поскольку приложения, запрашивающие возможности корпоративных аутентификационных или общих пользовательских сертификатов, требуют более высокий уровень проверки должен быть принят в Windows Store, и не все разработчики могут пожелать выполнить более высокий уровень проверки. Обратите внимание, что базовая реализация на платформе UWP (WAB) не работает правильно в сценариях Enterprise, где был включен условный доступ. Симптом состоит в том, что пользователь пытается войти в систему с помощью Windows hello, и ему предлагается выбрать сертификат, но сертификат для PIN-кода не найден, или пользователь выбирает его, но никогда не получает запрос на PIN-код. Обходной путь должен использовать альтернативный метод (имя пользователя / пароль + проверка подлинности телефона), но опыт не является хорошим. В будущем ADAL и MSAL потребуется использовать WAM, что решит проблему.

Получение URI перенаправления в случае магазина приложений Windows 8.1

Примечание: поддержка Win8.1 и Windows Phone 8.1 остановлена ​​в ADAL 4.x. Приложение Windows 10 (UWP) по-прежнему поддерживается

В случае приложений Windows Store, вам нужно будет найти URI обратного вызова для вашего приложения Windows Phone. Самый простой способ сделать это - добавить строку в метод Initialization (например, в MainPage) и установить точку останова на этой строке в методе:

var redirectURI = Windows.Security.Authentication.Web.WebAuthenticationBroker.GetCurrentApplicationCallbackUri ();

затем запустите приложение и скопируйте значение redirect Uri при достижении точки останова. Это должно выглядеть примерно так: ms-app://s-1-15-2-1352796503-54529114-405753024-3540103335-3203256200-511895534-1429095407/ Назад на вкладку ReplyURLs своего приложения на портале Azure добавьте это значение.

Надеюсь, это окажется полезным для всех, кто борется с той же проблемой!

Если ADAL.NET приобрел для пользователя токен для веб-API, кэширует его вместе с токеном обновления. В следующий раз, когда приложение захочет получить токен, оно может сначала вызвать AcquireTokenSilentAsync проверить, находится ли приемлемый токен в кэше.

AuthenticationContext ac = new AuthenticationContext(authority);
AuthenticationResult result=null;
try
{
 result = await ac.AcquireTokenSilentAsync(resource, clientId);
}
catch (AdalException adalException)
{
 if (adalException.ErrorCode == AdalError.FailedToAcquireTokenSilently
     || adalException.ErrorCode == AdalError.InteractionRequired)
  {
   result = await ac.AcquireTokenAsync(resource, clientId, redirectUri,
                                       new PlatformParameters(PromptBehavior.Auto));
  }
}

Для получения дополнительной информации, пожалуйста, обратитесь к этому.

Другие вопросы по тегам