2013-05-03 5 views
5

Я новичок в Visual Studio 2012 и MVC 4, и я работал с SimpleMembershipProvider через библиотеку WebMatrix.WebData.Внешняя учетная запись входа в учетную запись против учетной записи пользователя Native

Я хотел бы интегрировать Facebook в качестве внешнего источника входа по дороге, но это не является требованием прямо сейчас. Тем не менее, чтобы получить достойное представление о том, что потребуется, я следил за учебником и руководством, найденным здесь - http://www.asp.net/mvc/tutorials/mvc-4/using-oauth-providers-with-mvc.

Мой вопрос:

Если пользователь уже создан с помощью:

WebSecurity.CreateUserAndAccount(model.Email, model.Password); 
WebSecurity.Login(model.Email, model.Password); 

Могут ли они быть «повышен» до oAuthMemebership счета в будущем, если они хотят, чтобы использовать их Facebook учетные данные вместо электронной почты и пароля, которые они создали при первой регистрации?

Я не мог найти четкого ответа на этот вопрос в руководстве или в другом месте, поэтому я надеюсь, что кто-то сможет прояснить, как этот процесс может работать.

+1

Я думаю, что вы имеете дело с несовместимыми типами. У вас может быть простое членство, у вас может быть OAuth, или вы можете использовать ОБА. –

+0

@DaveA. Я смущен. Если у вас могут быть «A» или «B» или «A и B», как они несовместимы? –

+0

@ AndyBrown Вы можете выращивать оранжевое дерево. Вы можете вырастить яблоня. Вы можете выращивать оранжевое дерево и яблоня. Вы не можете выращивать Apple-Orange Tree. –

ответ

9

Настройка SimpleMembership позволяет локальным и множественным входам в систему OAuth использовать один и тот же UserProfile - поэтому один пользователь может войти в систему с помощью локального пароля или FacebOogLiveWitter.

(Должен сказать, что я предполагаю в этом ответе, что поставщик OAuth не отправляет обратно соответствующую информацию для локальной учетной записи. Если это так, то принципы фактического выполнения слияния одинаковы, но сложность и шаги значительно сокращаются.)

Процесс регистрации OAuth будет отклонять пользователя, если он использует существующее имя пользователя, вместо того, чтобы пытаться объединить две учетные записи. Поэтому это не просто, вам придется самостоятельно создавать функциональность. Процесс является сложным, так как есть много направлений, к которым пользователь может приблизиться к этому (так что вы можете упростить, поддерживая только один или два), и вам также необходимо обеспечить безопасность, если кто-то попытается объединиться в учетную запись, которой они не владеют ,

Предполагаю, что вам удобно со ссылкой, которую вы опубликовали, и вы следовали помощи Facebook (например) Facebook Login и The Login Flow for Web (without JavaScript SDK), поэтому у вас есть рабочее тестовое приложение.

Ваш общий процесс должен иметь несколько подходов пользователя в пути, чтобы иметь смысл для пользователя:

  1. для зарегистрированного пользователя (с локальной учетной записи)
    1. пусть они войти в Facebook и ассоциировать счета
    2. пусть объединить существующую учетную запись на сайте, который использует facebook логин
  2. для вошедшего в систему пользователя (с помощью учетной записи facebook)
    1. позволяют им создать локальную учетную запись
    2. пусть объединить существующую локальную учетную запись на сайте
  3. для не вошедшего в систему пользователя, который пытается зарегистрировать учетную запись локального
    1. пусть объединить этот новую учетную запись с регистрацией в facebook, которая уже зарегистрирована, и сделать это как часть процесса регистрации
  4. для пользователя без регистрации, который пытается зарегистрироваться (или войти в систему для th е первый раз с) учетной записью facebook
    1. пусть связывает это с существующей локальной учетной записью в рамках процесса регистрации

т.д.

ASK РАЗРЕШЕНИЕ

(Вы можете пропустить это, если поставщик OAuth отправил обратно соответствующую идентифицирующую часть информации, такую ​​как адрес электронной почты).

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

  • кто-то может войти в ваш сайт с Facebook в первый раз
  • в ходе этого процесса говорят, что они «собственный» адрес электронной почты или имя пользователя локальной учетной записи (помните, facebook не обязательно подтверждает, что их электронная почта для вас)
  • и, следовательно, получить доступ к существующей учетной записи локального

Итак, когда слияние «запрос» сделано, вы должны попросить разрешения исходить из целевой счет слияния ,

MVC 4 AccountController

Я буду использовать Facebook в качестве нашего примера OAuth. Чтобы сравнить, что происходит, когда вы регистрируете пользователя в своей локальной системе проверки подлинности vs.OAuth:

  • Local: создает запись в webpages_Membership и запись с таким же UserId в UserProfile (если вы используете таблицы по умолчанию для шаблона приложения MVC 4)
  • OAuth: создает запись в webpages_OAuthMembership и запись с тем же UserId в UserProfile

Теперь давайте посмотрим, что происходит, когда пользователь входит в использовании Facebook в первый раз:

  • Они нажимают на Вход с использованием Facebook (или что ваша кнопка говорит)
  • они получают доставлены в Facebook, чтобы войти в систему
  • им удается (давайте предположим, что, и игнорировать случай отказа)
  • затем они отправляют, незримо их, чтобы /Account/ExternalLoginCallback
  • OAuthWebSecurity.SerializeProviderUserId называется, передавая детали OAuth для этого действий
  • Они получают перенаправлены /Account/ExternalLoginConfirmation и попросили предоставить имя для своего нового присутствия на сайте
  • Если имя пользователя доступно, то UserProfilend webpages_OAuthMembership создаются

Этот процесс - это ваш шанс «присоединиться» к учетным записям, сопоставив уникальную информацию. Пока вы заканчиваете тем же UserId в UserProfile, webpages_Membership и webpages_OAuthMembership, вы должны быть в порядке. Поэтому мы должны перехватить процесс в точке /Account/ExternalLoginConfirmation.

Если поставщик OAuth отправил обратно соответствующую идентифицирующую часть информации, такую ​​как адрес электронной почты, это станет простым, проверьте это в действии ExternalLoginConfirmation и выполните автоматическое слияние с использованием аналогичного процесса, описанного ниже.

Тем не менее, я думаю, вы не можете/не должны предполагать, что пользователь использует тот же адрес электронной почты для вашего сайта и OAuth (и вы не должны по многим причинам). Кроме того, вероятно, в T & Cs для чего-то вроде FacebOogLiveWitter он все равно перестает вас спрашивать по электронной почте их учетной записи, и если они в настоящее время не могут в будущем.

Так вместо этого, вы можете связать аккаунты на основе альтернатив, как имя пользователя или адрес электронной почты, или номер телефона. В любом случае вам понадобятся они, чтобы ввести некоторую идентифицирующую часть информации, уникальную для учетной записи, и отбросит целевую учетную запись.

Завершая

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

Ваш процесс будет необходимо:

(Успенская - когда пользователь впервые регистрируется в локальной учетной записи, вы просите их адрес электронной почты и подтвердить его или считать действительно)

  • Пусть пользователь Войти с Facebook в первый раз
  • на Account/ExternalLoginConfirmation спросить их, если они хотят, чтобы
    • Создать новую учетную запись с вами
    • Используйте свой facebook логин для доступа к существующей учетной записи
  • Предполагая, что последнее, то вы войдете запрос в новую таблицу (возможно, «MergeAccountRequests») с:
    • facebook счет USERID
    • мишени merge local account UserId
    • Код авторизации для использования в письме, которое необходимо отправить (С этого момента, если они войдут без подтверждения этого слияния, им необходимо будет отправить на страницу, чтобы попросить их подтвердить, а чем создавать объекты в других таблицах db, о которых вам нужно беспокоиться позже)
  • Затем отправить по электронной почте на адрес целевого объединения (местного) счета с просьбой разрешить завершить слияние (стандартное подтверждение по электронной почте, со ссылкой)
  • При нажатии на эту ссылку , или введите код, который вы им отправили (вы можете использовать SMS, а также электронную почту), тогда вам нужно объединить два счета.
    • Выберите «новые» и «целевые учетные записи (в этом случае« новый »- это учетная запись на facebook поскольку у вас еще нет данных, связанных с ним)
    • Удалить UserProfile из «новой» учетной записи
    • Изменение UserId «новой» webpages_OAuthMembership таблицы счета, к тому же, как «цель» Счет
    • входа пользователя из (так что нет никаких осложнений, в зависимости от которых зарегистрированы в настоящее время они вошли в систему с)
    • Отображение сообщения для пользователя, говоря им, что слияние почти завершена, и теперь они могут войти с помощью любого аккаунта, чтобы подтвердить и завершить слияние

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

+3

Спасибо за подробный ответ здесь. – X3074861X

+0

Хорошее объяснение. Можем ли мы иметь несколько внешних логинов для пользователя для одного клиента? У меня есть учетные записи google, facebook, linkedin с тем же адресом электронной почты. Теперь я могу войти в любое приложение OAuth со всеми этими внешними учетными записями? – Venky