Может ли веб-сайт пройти аутентификацию на нескольких серверах ADFS?

У нас есть веб-сайт ASP.NET/MVC, использующий FormsAuthentication. Как обычно, когда пользователь пытается получить доступ к странице и не имеет действительного файла cookie FormsAuthentication, IIS перенаправляет его в представление входа. Когда пользователь выполняет HttpPost для контроллера входа в систему, действие нашего контроллера вызывает нашу веб-службу WebApi, которая проверяет имя пользователя, пароль и идентификатор клиента в базе данных Sql Server. Если проверка подлинности проходит успешно, действие контроллера устанавливает файл cookie FormsAuthentication и перенаправляет на запрошенную пользователем страницу.

Теперь в отделе продаж шумят о «едином входе», хотя я не совсем понимаю, что они под этим подразумевают. Из того, что я читал, в мире Microsoft это обычно означает доступ к службам MS Active Directory Federation Services.

На данный момент я почти не представляю, как это будет работать, но прежде чем я углублюсь в это слишком глубоко, можно ли поместить код аутентификации в веб-службу WebApi, где мы могли бы выбрать проверку по базе данных Sql Server или по какой сервер ADFS подходит для указанного клиента?

Наша проблема в том, что у нас не знаю сколько тысяч пользователей, работающих на какие-то сотни клиентов. У многих клиентов не будет запущена служба ADFS, а у тех, у кого она есть, будет свой собственный сервер ADFS.

Большая часть того, что я вижу в отношении единого входа, похоже, связана с перенаправлением браузера на сервер ADFS, затем перенаправлением обратно и, похоже, вообще избеганием входа в систему, если вы уже вошли в систему. Я не думаю, что мы может сделать это, в нашем случае. Мы не можем знать, на какой сервер ADFS перенаправляться, пока не попадем в базу данных.

Итак, вопрос - можно ли полностью выполнить аутентификацию ADFS из кода C # в нашем веб-сервисе WebAPI?

(Одно из возможных осложнений — сам веб-сайт не имеет доступа к какой-либо базе данных. Единственным параметром конфигурации в его web.config является базовый URL-адрес веб-службы. Какая бы аутентификация ни происходила, она должна происходить в веб-службе, а не на веб-сайте.)


person Jeff Dege    schedule 28.07.2016    source источник
comment
Всегда, когда вы сомневаетесь, что такое SSO, подумайте об экосистеме Google. Вы получаете доступ к любому из их приложений, вы перенаправляетесь на страницу входа в другое приложение, а затем перенаправляетесь обратно с информацией об аутентифицированном пользователе. Такое разделение позволяет поставщику удостоверений вводить новые функции (например, двухфакторную аутентификацию), не беспокоя все приложения, использующие поставщика удостоверений. И, неправда, SSO в мире Microsoft не привязан к ADFS. Это просто один из вариантов.   -  person Wiktor Zychla    schedule 29.07.2016


Ответы (2)


Прежде всего, «Единый вход» (SSO) не ограничивается ADFS. Это просто означает, что вы вводите свои учетные данные только один раз, а затем все системы, к которым вы обращаетесь, автоматически «узнают» вас; все последующие запросы авторизации прозрачны. Например, если у вас есть несколько веб-сайтов, использующих аутентификацию Windows во внутренней сети вашей компании (тот же домен AD), у вас есть SSO: вы проходите аутентификацию один раз при входе в свой компьютер, а затем ваш веб-браузер автоматически выполняет аутентификацию на этих веб-сайтах с использованием NTLM. или Керберос. В этом случае нет ADFS.

Что позволяет ADFS (и «Федерация» в целом), так это SSO через границы безопасности. В мире Windows зона безопасности обычно создается лесом Active Directory; все в этом лесу доступно с помощью единого входа, обеспечиваемого проверкой подлинности Windows. Но как только вы покидаете эту зону (приложение SaaS, веб-сайт в сети другой компании), вам нужен другой протокол аутентификации для выполнения SSO, и эти протоколы реализованы в ADFS.

Тогда о вашей конкретной проблеме:

  • Что вы могли бы сделать, это вместо использования FormsAuth вы используете AdfsAuth. Когда неизвестный пользователь получает доступ к странице, он будет перенаправлен в ADFS для аутентификации (используя перенаправления браузера, как вы правильно упомянули). Чтобы узнать, какой сервер ADFS должен аутентифицировать вашего пользователя, вам нужен способ действительно различать их: список диапазонов IP-адресов для каждого клиента? другой URL для каждого клиента? Если у вас нет чего-то подобного, то единственный способ — показать им список вариантов, таких как: «Я работаю в компании А», «Я работаю в компании Б», «Я работаю в компании С», «Я не работаю». Я не работаю ни в одной из этих компаний и хочу пройти аутентификацию с помощью FormsAuth».
  • В этом случае ваша веб-служба WebApi должна сделать следующее: если я знаю, какой сервер ADFS использовать, перенаправить пользователя туда. В противном случае аутентифицируйте пользователя, как обычно, используя базу данных.
  • Когда вы используете AdfsAuth для клиента, ваша база данных бесполезна. Вы можете удалить все учетные данные, связанные с этим клиентом.

выполнять аутентификацию ADFS полностью из кода C# в нашем WebAPI

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

person Matthieu    schedule 28.07.2016

При аутентификации у нескольких поставщиков удостоверений обычно выполняется перенаправление на ваш собственный. СТС. Таким образом, в этом случае у вас будет перенаправление с www.yourapp.com на sts.yourapp.com, которое перенаправляет на sts.somecustomer.com.

Диаграмма, показывающая RP-STS

Конкретными инструментами для включения такого потока данных является параметр home realm ( whr) и API Powershell AD FS (чтобы разрешить обслуживание IDP).

Ваш RP-STS действует как точка доверия для приложения и управляет выбором соответствующего IDP. Один RP-STS, много IP-STS. Каждый IP-STS вашего клиента настраивается как доверие поставщика утверждений в AD FS.

Как всегда, Vittorio уже покрыл тему лучше, чем я мог.

Изображение, показывающее, как два IP-STS проходят аутентификацию на одном RP-STS с одним RP

person Mitch    schedule 28.07.2016