Если вы не любите использовать большие библиотеки, такие как 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
});
}
и используйте эту информацию для идентификации пользователя в вашей внутренней базе данных.
Так вот идея:
- Вы создаете внутреннюю таблицу базы данных, которая будет содержать пользователей вашего сайта. В начале эта таблица пуста.
- Пользователь заходит на ваш сайт и хочет его использовать. Он еще не аутентифицирован, поэтому вы спрашиваете его о полномочиях. Вы предоставляете ему возможность выбрать своего провайдера OpenId, подготовить запрос на аутентификацию и перенаправить его к своему провайдеру для аутентификации.
- Пользователь аутентифицируется у своего провайдера и перенаправляется обратно на ваш сайт. В этот момент вы знаете его заявленную личность и добавляете пользователя в свою таблицу пользователей. Теперь пользователь всегда может вернуться на ваш сайт и войти в систему.
- Вы можете предоставить своим аутентифицированным пользователям возможность добавить другого поставщика OpenId (как это делает StackOverflow). Важная идея состоит в том, что пользователь должен уже пройти аутентификацию на вашем сайте, чтобы сделать это. Таким образом, он мог войти в свой альтернативный поставщик OpenId и быть перенаправлен к этому провайдеру для аутентификации. Как только он аутентифицируется, он перенаправляется обратно на ваш сайт, и, поскольку он уже прошел аутентификацию на вашем сайте, вы можете добавить в таблицу пользователей его альтернативного поставщика OpenId.
- Действие контроллера, которое будет обрабатывать перенаправление от провайдера OpenId, должно проверять, прошел ли пользователь аутентификацию на вашем сайте, а если нет, то аутентифицировать его, используя
FormsAuthentication.GetAuthCookie
и передавая заявленный идентификатор. Если заявленная идентификационная информация не существует в вашей внутренней таблице пользователей, вам нужно добавить ее. Если пользователь уже прошел проверку подлинности на вашем сайте, это означает, что он добавляет в свой профиль альтернативного поставщика OpenId, поэтому вы должны обновить таблицу пользователей и добавить в нее нового поставщика.