Реализация OpenID в ASP.net "Правильно" - членство или провайдер аутентификации?
Существует несколько способов использования OpenID на сайтах ASP.net, но ни один из них, похоже, не использует существующий механизм поставщиков членства и аутентификации.
Интересно, как правильно создать сайт, который полагается исключительно на OpenID? Продолжаете использовать проверку подлинности с помощью форм, но реализуете вариант SqlMembershipProvider, который выполняет поиск по OpenID?
Или я бы пошел на один уровень глубже и написал бы свой собственный FormsAuthenticationModule? Кажется, что это слишком чересчур, поскольку (насколько мне известно) проверка подлинности с помощью форм может проверяться на любом источнике данных.
Или есть третий способ, сохраняя FormsAuthenticationModule, но заставляя его выполнять поиск по OpenID?
Так как это для приложения ASP.net MVC, я не использую встроенные элементы управления WebForms, если это имеет значение.
6 ответов
Членский API, который определяет ASP.NET, не совсем подходит для OpenID, поэтому, вероятно, вы не видите много систем, использующих его. Я еще не видел необходимости использовать поставщика членства с OpenID, так что это действительно не стало проблемой. Http://code.google.com/p/dotnet-membership-provider/ Один из проектов, который пытался привести модель провайдера членства в соответствие с OpenID, - это не похоже, что он был недавно поддержан.
Как сказал womp, вам не нужно переделывать FormsAuthenticationModule. Он отлично работает с OpenID.
Проверьте шаблоны проектов, которые поставляются с DotNetOpenAuth, чтобы увидеть, как все может работать без поставщика членства.
Возможно, вам нужен проект OpenID Membership Provider.
И хотя вы не используете элементы управления входом, все же рекомендуется использовать модель поставщика членства для проверки подлинности.
Обычно нет необходимости заходить так глубоко, как реализация специфической функциональности FormsAuthentication, поскольку написание MemberhipProvider довольно тривиально, и я никогда не встречал случая, когда он не был бы достаточно гибким, чтобы его обрабатывать. Обратите внимание, что часто вам нужно реализовать только один метод (ValidateUser()) интерфейса, чтобы получить работающего провайдера.
Это старый вопрос, но я не видел подход, который использовал, когда искал его, так что здесь. (Он протестирован только в Google, так как я создаю вид интеграции с аккаунтом Google Apps для бизнеса моей компании, а не полную интеграцию OpenID.)
Я использую DotNetOpenAuth, чтобы запросить OpenID, убедившись, что мне требуется адрес электронной почты.
request.AddExtension(new ClaimsRequest
{
BirthDate = DemandLevel.NoRequest,
Email = DemandLevel.Require,
FullName = DemandLevel.Require
});
Затем, когда я возвращаю аутентифицированный ответ, я ищу имя пользователя по электронной почте:
case AuthenticationStatus.Authenticated:
ClaimsResponse info = response.GetExtension<ClaimsResponse>();
string username = Membership.GetUserNameByEmail(info.Email);
FormsAuthentication.SetAuthCookie(username, true);
return Redirect(ReturnUrl ?? "/");
Предполагая, что у вас также есть настроенный поставщик членства и ролей, настройка файла cookie Auth для соответствующего имени пользователя дает вам доступ ко всем остальным правилам членства и ролей.
Образец ASP.NET MVC, включенный в DotNetOpenId, использует FormsAuthentication для входа пользователя в систему после того, как он был аутентифицирован OpenID. Насколько я могу судить, он не интегрируется с системой членства.
Если вам нужно использовать userID(guid)
Затем из вашей базы данных участников вам нужно будет создать скелетную учетную запись при первом входе в систему, а затем выяснить механизм поворота нового пароля при последующих входах. Этот пароль, очевидно, будет для вашего поставщика услуг членства и будет прозрачным.
Теперь самое интересное - найти метаданные, которые являются общими? Может быть, адрес электронной почты HMM?
Я работаю над этой дилеммой и с Facebook Connect. У меня должен быть идентификатор пользователя, чтобы связать их с секретными записями в моей базе данных.
Прикольные вещи.
Просто обновление. Я получил это работает хорошо.
Я создал таблицу
CREATE TABLE [dbo].[OAuthUsers]
(
[OuthUserID] [int] IDENTITY(1,1) NOT NULL,
[UserID] [uniqueidentifier] NOT NULL,
[access_token] [varchar](150) NULL,
[expires_in] [datetime2](7) NULL,
[refresh_token] [varchar](150) NULL,
[issued_at] [datetime2](7) NULL,
[user_id] [varchar](50) NOT NULL,
[domain] [varchar](50) NULL,
[scope] [varchar](150) NULL,
CONSTRAINT [PK_OAuthUsers] PRIMARY KEY CLUSTERED
)
Хранить access_token
для Facebook или OpenID. OpenID имеет токен обновления, который вы можете запросить, поэтому сохраните его
У меня есть обработчик Ashx в качестве моего redirect_url. В этом обработчике вы можете выполнять всю обработку для каждого случая, у пользователя уже есть учетная запись в базе данных провайдера, у пользователя нет учетной записи в базе данных провайдера, поэтому мы создаем ее. Вся эта аккуратная хрень:)
Веселитесь с этим.
Если кто-нибудь сталкивается с хорошим примером C# janrain - пожалуйста, дайте мне знать.
У меня есть DSN, указывая на Tumblr, а затем для виджета входа в систему он возвращается к поддомену, где у меня есть путь к папке под корнем.
так что у меня там есть папка app_code, в которой я использую этот вспомогательный класс C# - я могу получить токен обратно, и он переносит меня на мой members.domain.com, так что виджет работает - просто нужно получить данные пользователя на провайдера, которого они использовали, чтобы добраться до области членов.
http://groups.google.com/group/rpx-developers/web/c-helper-class?_done=/group/rpx-developers%3F
это класс помощника
ошибка
Ошибка сервера в приложении '/' Неожиданная ошибка API Описание: во время выполнения текущего веб-запроса произошло необработанное исключение. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.
Сведения об исключении: System.Exception: непредвиденная ошибка API
Ошибка источника:
Строка 22: Строка 23: Rpx feedit = new Rpx ("apikey", " https://learnbartending.rpxnow.com/"); Строка 24: feedit.AuthInfo(justoken); Строка 25: XmlElement xmlstuff = feedit.AuthInfo(justoken); Строка 26:
Исходный файл: c:\Inetpub\vhosts\learnbartending.com\httpdocs\members\Default.aspx.cs Строка: 24
Трассировки стека: