Войти через FB Connect / Google OAuth в .NET - PullRequest
5 голосов
/ 16 января 2011

Я бы хотел, чтобы мои пользователи могли заходить на мой сайт, используя мою систему авторизации, или FB Connect или Google Login.Я не хотел бы использовать большие библиотеки (например, dotnetOpenAuth) только для этих двух вариантов. Итак, как мне это сделать?

Дополнительный вопрос - как мне привязать пользователя FB / Google к моей внутренней пользовательской системе?Я хотел бы разрешить вход в систему, используя оба из них (например, я мог войти в систему, используя FB, а затем войти в систему с Google, и все еще быть связанным с тем же пользователем).

Я использую ASP.NET MVC2

Спасибо!

1 Ответ

15 голосов
/ 16 января 2011

Если вы не любите использовать большие библиотеки, такие как DotnetOpenAuth , вам придется вручную реализовать протокол OpenID. Вот спецификации , которые вам необходимо будет выполнить.

При этом я бы порекомендовал вам использовать существующую библиотеку. DotnetOpenAuth - справочная библиотека для .NET.

Также небольшое замечание: OpenId и OAuth являются разными стандартами и предназначены для достижения разных целей: OpenId для аутентификации, а OAuth для авторизации.

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

using (var openid = new OpenIdRelyingParty())
{
    var request = openid.CreateRequest(Identifier.Parse(openid_identifier));

    request.AddExtension(new ClaimsRequest
    {
        BirthDate = DemandLevel.NoRequest,
        Email = DemandLevel.Require,
        FullName = DemandLevel.Require
    });
}

и используйте эту информацию для идентификации пользователя в вашей внутренней базе данных.

Так вот идея:

  1. Вы создаете внутреннюю таблицу базы данных, которая будет содержать пользователей вашего сайта. В начале эта таблица пуста.
  2. Пользователь заходит на ваш сайт и хочет его использовать. Он еще не аутентифицирован, поэтому вы спрашиваете его о полномочиях. Вы предоставляете ему возможность выбрать своего провайдера OpenId, подготовить запрос на аутентификацию и перенаправить его к своему провайдеру для аутентификации.
  3. Пользователь аутентифицируется у своего провайдера и перенаправляется обратно на ваш сайт. В этот момент вы знаете его заявленную личность и добавляете пользователя в свою таблицу пользователей. Теперь пользователь всегда может вернуться на ваш сайт и войти в систему.
  4. Вы можете предоставить своим аутентифицированным пользователям возможность добавить другого поставщика OpenId (как это делает StackOverflow). Важная идея состоит в том, что пользователь должен уже пройти аутентификацию на вашем сайте, чтобы сделать это. Таким образом, он мог войти в свой альтернативный поставщик OpenId и быть перенаправлен к этому провайдеру для аутентификации. Как только он аутентифицируется, он перенаправляется обратно на ваш сайт, и, поскольку он уже прошел аутентификацию на вашем сайте, вы можете добавить в таблицу пользователей его альтернативного поставщика OpenId.
  5. Действие контроллера, которое будет обрабатывать перенаправление от провайдера OpenId, должно проверять, прошел ли пользователь аутентификацию на вашем сайте, а если нет, то аутентифицировать его, используя FormsAuthentication.GetAuthCookie и передавая заявленный идентификатор. Если заявленная идентификационная информация не существует в вашей внутренней таблице пользователей, вам нужно добавить ее. Если пользователь уже прошел проверку подлинности на вашем сайте, это означает, что он добавляет в свой профиль альтернативного поставщика OpenId, поэтому вы должны обновить таблицу пользователей и добавить в нее нового поставщика.
...