Аутентификация с помощью ADFS внутри консольного приложения беззвучно

У меня есть консольное приложение С #, которое ссылается на библиотеку ADAL.net (Microsoft.IdentityModel.Clients.ActiveDirectory версии 2.19.208020213)

Цель консольного приложения - использовать конечную точку HTTP, защищенную с помощью ADFS.

Реализация аутентификации ADFS выглядит следующим образом ....

var uc = new UserCredential("user", "password");
var ctx = new AuthenticationContext("https://sts.example.com/adfs", false);
var token = ctx.AcquireToken(ClientResourceUri, ClientId, uc);

Вызов AcquireToken вызывает исключение ...

Эта перегрузка метода не поддерживается https://sts.example.com/adfs/.

Вызов AcquireToken без объекта UserCredential и вместо этого предоставление redirectUri работает, но вызывает диалоговое окно с запросом имени пользователя и пароля, что неприемлемо, поскольку консольное приложение будет выполняться в непользовательской среде ...

var redirect = new Uri("https://example.com/arbitaryRedirect");
var token = ctx.AcquireToken(ClientResourceUri, ClientId, redirect);
//dialog is shown

Если я перейду на последнюю альфа-версию библиотеки adal.net (3.6.212041202-alpha), ошибка станет более показательной ...

MSIS9611: сервер авторизации не поддерживает запрошенный «grant_type». Сервер авторизации поддерживает только «authorization_code» или «refresh_token» в качестве типа предоставления.

Однако добыча в Google дает очень мало.

Действительно ли возможна автоматическая аутентификация в ADFS?

Правильно ли я предположил (на основе ответов в других сообщениях), что правильный подход - использовать вместо этого WsTrustChannelFactory?

Если нет, то какой подход лучше?


person Baldy    schedule 13.01.2016    source источник
comment
Могу я предложить включить журнал отладки в соответствии с github.com/AzureAD/azure-activedirectory -library-for-dotnet? Если бы я был на вашем месте, я бы также взял Fiddler, чтобы посмотреть, какой запрос отправляется на sts.example Конечная точка .com / adfs / oauth2 / authorize была. Этот MSIS9611 обычно сопровождается MSIS9245.   -  person maweeras    schedule 14.01.2016


Ответы (1)


Возможно использование ADAL 3.x и ADFS в Windows Server 2016 с почти тем же кодом, который вы опубликовали. Комбинации старых версий ADAL или ADFS не будут работать. В качестве альтернативы вы можете использовать WS-Trust, с которым значительно труднее справиться, но с ним можно справиться.

person vibronet    schedule 13.01.2016
comment
Спасибо, Витторио, я просмотрел немало ваших сообщений в блоге за последние несколько дней, пытаясь собрать их воедино. У меня есть WsTrust для аутентификации и возврата RST через мыло, теперь мне просто нужно выяснить, могу ли я каким-то образом преобразовать это в JWT (или любой токен, который будет работать с HTTP) и использовать его в HTTP-запросе к API, защищенный ADFS. - person Baldy; 14.01.2016
comment
У вас должна быть возможность получить JWT напрямую через wstrust - документация adfs должна дать некоторые подсказки по этому поводу, хотя я никогда не делал этого сам - person vibronet; 14.01.2016
comment
@Baldy: Я столкнулся с той же проблемой - мне нужно получить доступ к REST API, который защищен ADFS, работающей на Windows Server 2012R2. Вы придумали, как этого добиться? - person nyn3x; 02.02.2018
comment
есть ли документация о том, как настроить ADFS 2016, чтобы разрешить запрос OPs? Я не могу, хоть убей, заставить это работать, и думаю, что у меня нет правильных настроек конфигурации в ADFS 2016. - person JoeyD; 18.04.2018