Если вам не нравятся большие библиотеки, такие как DotnetOpenAuth, вам придется вручную реализовать протокол OpenID. Here are the specifications вам нужно будет соответствовать.
Это, как говорится, я бы рекомендовал вам использовать существующую библиотеку. DotnetOpenAuth
- справочная библиотека для .NET.
Также небольшое примечание: OpenId и OAuth являются разными стандартами и предназначены для достижения разных целей: OpenId
предназначен для аутентификации, а OAuth
- для авторизации.
Что касается идентификации того же пользователя, который мог бы регистрироваться из разных поставщиков OpenID, вам потребуется что-то, чтобы идентифицировать их. Например, с DotnetOpenAuth при создании запроса аутентификации провайдера OpenID вы можете потребовать от FullName и e-mail:
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, должны проверить, прошел ли пользователь уже на вашем сайте и если он не аутентифицировал его с использованием и передачи заявленного идентификатора. Если заявленная идентификация отсутствует в вашей внутренней таблице пользователей, ее необходимо добавить. Если пользователь уже прошел аутентификацию на вашем сайте, это означает, что он добавляет альтернативный провайдер OpenId к своему профилю, поэтому вы должны обновить таблицу своих пользователей и добавить к нему нового поставщика.
Возможно, вы знаете небольшую реализацию системы входа в систему Google? – Roman
@roman, лично я использую DotnetOpenAuth. –
Спасибо. Я просто боялся, что это слишком сложно и на 100% надежнее. Это? :) – Roman