Реализация OpenID в ASP.net «Правильно» - членство или провайдер аутентификации? - PullRequest
13 голосов
/ 28 мая 2009

Существует несколько способов использования OpenID на сайтах ASP.net, но ни один из них, похоже, не использует существующий механизм поставщиков членства и аутентификации.

Интересно, как правильно было бы создать сайт, основанный исключительно на OpenID? Продолжаете использовать проверку подлинности с помощью форм, но реализуете вариант SqlMembershipProvider, который выполняет поиск по OpenID?

Или я бы пошел на один уровень глубже и написал бы свой собственный FormsAuthenticationModule? Кажется, это слишком чересчур, поскольку (насколько мне известно) проверка подлинности с помощью форм может быть проверена на любом источнике данных.

Или есть третий способ - сохранить FormsAuthenticationModule, но заставить его выполнять поиск по OpenID?

Поскольку это для приложения ASP.net MVC, я не использую встроенные элементы управления WebForms для входа, если это имеет значение.

Ответы [ 6 ]

10 голосов
/ 28 мая 2009

Членский API, который определяет ASP.NET, не совсем подходит для OpenID, поэтому, вероятно, вы не видите много систем, использующих его. Я еще не видел необходимости использовать поставщика членства с OpenID, так что это действительно не стало проблемой. Один проект, который попытался привести модель провайдера членства в соответствие с OpenID, это http://code.google.com/p/dotnet-membership-provider/,, но не похоже, что он поддерживается недавно.

Как сказал womp, вам не нужно переделывать FormsAuthenticationModule. Он отлично работает с OpenID.

Ознакомьтесь с шаблонами проектов , которые поставляются с DotNetOpenAuth , чтобы увидеть, как все может работать без поставщика членства.

4 голосов
/ 28 мая 2009

* * * * * * * * * * * * * * * * * * * * * * *, * * * * * * * *, возможно, вам нужен проект.

И даже если вы не используете элементы управления входом, рекомендуется использовать модель поставщика членства для аутентификации.

Обычно нет необходимости вдаваться в подробности при реализации специфической функциональности FormsAuthentication, поскольку написание MembershipProvider довольно тривиально, и я никогда не встречал случая, когда он не был бы достаточно гибким, чтобы его обрабатывать. Обратите внимание, что часто вам нужно реализовать только один метод (ValidateUser ()) интерфейса, чтобы получить работающего провайдера.

2 голосов
/ 23 февраля 2012

Это старый вопрос, но я не видел подход, который использовал, когда искал его, так что здесь. (Он протестирован только с 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 авторизации форм для соответствующего имени пользователя дает вам доступ ко всем остальным правилам членства и ролей.

0 голосов
/ 24 февраля 2011

Если вам нужно использовать 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. В этом обработчике вы можете выполнять всю обработку для каждого случая, у пользователя уже есть учетная запись в базе данных поставщика, у пользователя нет учетной записи в базе данных поставщика, поэтому мы создаем ее. Вся эта аккуратная хрень:)

Веселитесь вместе с ним.

0 голосов
/ 16 июля 2010

если кто-нибудь сталкивается с хорошим примером 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

Трассировка стека:

0 голосов
/ 28 мая 2009

Образец ASP.NET MVC, включенный в DotNetOpenId , использует FormsAuthentication для входа пользователя в систему после того, как он был аутентифицирован OpenID. Насколько я могу судить, он не осуществляет какую-либо интеграцию с системой членства.

...