Подтвердить что ты не робот

Как разрешить несколько методов проверки подлинности в ASP.NET?

Я создаю новое приложение ASP.NET MVC (на С#), и одним из требований является создание новой базы данных членов. Для этого нам нужны роли для управления различными типами членов и профилей для управления дополнительными метаданными, прикрепленными к каждому члену. До сих пор так хорошо, просто используйте стандартные MembershipProvider, RoleProvider и ProfileProvider, предоставляемые как часть .NET Framework.

Однако уловка заключается в том, что я хотел бы разрешить различные методы аутентификации. Я бы хотел, чтобы Учетные записи и учетные данные для входа имели отношение "один ко многим" (одна учетная запись может содержать несколько учетных данных для входа). Например, пользователь может иметь учетную запись OpenID и ActiveDirectory, прикрепленную к их учетной записи.

Однако после нескольких экспериментов мы выбрали маршрут MembershipProvider (объяснили, как это было достигнуто в качестве ответа ниже).

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

РЕДАКТИРОВАТЬ: Оглядываясь в течение хорошего часа в ночное время и сегодня утром - я все еще не убежден в том, что самым простым вариантом было бы уничтожение одного участника-членства. Имеет ли множественные MembershipProviders тот же эффект?

BOUNTY EDIT: без ответов я предполагаю, что нет более оптимального решения, которое я написал в качестве ответа. Это действительно так? Я предлагаю щедрость попробовать и посмотреть, есть ли у кого-нибудь дальнейшие мысли об этом и есть ли лучшие альтернативы.

BOUNTY ACCEPT EDIT: Я думаю, что WIF - это ответ, как принято ниже, для выпуска .NET 4 и, возможно, для других версий, поскольку он, вероятно, работает с 3.5. Помимо этого, возможно, может быть уместен зараженный членский подход или адаптированный.

4b9b3361

Ответ 1

По-моему, "реальным способом" этого является использование федерации с WIF (Windows Identity Foundation, ранее Geneva framework).

Идея состоит в том, что вы отделяете аутентификацию от авторизации. Аутентификация выполняется так называемой STS (службой маркеров безопасности), и она управляет всем возможным механизмом входа, который вы хотите поддерживать. Когда пользователь аутентифицирован, STS выдает маркер, содержащий набор требований и идентификатор пользователя. Этот токен отправляется на веб-сайт (называемый полагающейся стороной в этом жаргоне), и веб-сайт определяет, какие части сайта пользователь имеет доступ на основе претензий в токене. WIF предоставляет поставщикам членства и роли, которые извлекают информацию из токена.

Вы можете прочитать о создании сайта, посвященного утверждениям здесь.

Одним из плюсов этого подхода является разделение проблем между аутентификацией и авторизацией. Вам не нужно какое-либо сложное членство и рольпровайдеров на вашем веб-сайте. Кроме того, STS можно повторно использовать для аутентификации пользователей в других приложениях, которые у вас могут быть, если они не должны регистрироваться более одного раза (эффективно достигая единого входа).

Недостатком является то, что вам придется потратить некоторое время на изучение этих концепций и кодирование STS. Имейте в виду, что нет простого кода STS с WIF, но это не 100% тривиальная задача.

Если мне удастся пощекотать ваш интерес, я бы порекомендовал вам начать с чтения этого документа.

С уважением,

Клаус

Ответ 2

Одна из наших идей заключалась в создании специализированного поставщика членства/роли/профиля. Мы значительно изменили методы входа/аутентификации и добавили дополнительную таблицу логинов. Эта таблица в основном содержала:

LoginID (Auto-Incremental ID, PK)
UserID (FK)
LoginSystemID (FK)
...blah blah

В приведенном выше примере LoginSystemID был ссылкой на внешнюю таблицу поиска, которая помогла системе определить, какую службу проверки подлинности использовать (например, стандарт, AD, OpenID, FacebookConnect и т.д.).

Проблема, с которой мы столкнулись, заключалась в том, что поле Username в MemberhipProvider не может быть пустым, и хотя в нашей схеме у каждого был UserID (это было имя учетной записи), у них не было имени пользователя, которое было уникальным. Мы должны были обойти это, создав GUID и используя это. Это, конечно, скрыто от пользователя, и вместо него может отображаться атрибут DisplayName из таблицы наших пользователей.

Все это было сделано через FormsAuthenication (проверки AD выполнялись с помощью проверок LDAP). Однако дополнительный уровень (веб-форма) был добавлен с соответствующими настройками в IIS, который предоставил средство для автоматической проверки подлинности WindowsA - мы перенаправляемся туда в том экземпляре, который, по нашему мнению, может быть внутренним (на основе IP-адреса).

Ответ 3

Использовать стандартные фреймворки. См. http://blogs.teamb.com/craigstuntz/2009/09/09/38390/

У вас может быть неограниченное количество методов проверки подлинности, подключенных к одной учетной записи, магия в инструкции FormsAuthentication.SetAuthCookie(userName, createPersistentCookie);